Zadam pytanie z przykładem. Mam 2 pliki:
Plik nr 1:
118D FC300_R5_TP FX.B 32775 2112 6 2038 6 2112 0
118E FC300_R5_TP FX.B 32775 2136 7 2065 6 2136 0
118F FC300_R5_TP FX.B 32775 2124 6 2064 6 2124 0
1190 FC300_R5_TP FX.B 819210 814632 99 814609 99 814632 0
1191 FC300_R5_TP FX.B 819210 104100 13 103714 13 104100 0
1192 FC300_R5_TP FX.B 1638420 1609476 98 1609402 98 1609476 0
1196 FC300_R5_TP FX.B 1638420 1638432 100 1638379 100 1638432 0
119A FC300_R5_TP FX.B 3276840 3271776 100 3271698 100 3271776 0
119E FC300_R5_TP FX.B 3276840 3264120 100 3264034 100 3264120 0
11A2 FC300_R5_TP FX.B 3276840 2328648 71 2328546 71 2328648 0
11A6 FC300_R5_TP FX.B 3276840 2328444 71 2328355 71 2328444 0
11AA FC300_R5_TP FX.B 3276840 2328528 71 2328403 71 2328528 0
11AE FC300_R5_TP FX.B 3276840 2328648 71 2328468 71 2328648 0
11B2 FC300_R5_TP FX.B 3276840 2130000 65 2129766 65 2130000 0
173A FC300_R5_TP FX.B 6553680 6478572 99 6477747 99 6478572 0
Plik nr 2:
11AA FC300_R5_TP FX.B 3276840 2328528 71 2328403 71 2328528 0
11AE FC300_R5_TP FX.B 3276840 2328648 71 2328468 71 2328648 0
11B2 FC300_R5_TP FX.B 3276840 2130000 65 2129766 65 2130000 0
173A FC300_R5_TP FX.B 6553680 6478572 99 6477747 99 6478572 0
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Pożądane wyjście
Plik nr 3:
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Chciałbym porównać plik 1 i plik 2 przy użyciu ich pierwszych kolumn i usunąć całą linię lub wiersz z pliku 2, w którym pasują do pliku 1. Chciałbym również zapisać wyniki w trzecim pliku, pliku nr 3.
źródło
Zgłasza wiersze, które są tylko w
f2
.Zgłasza wiersze,
f2
których pierwszego pola nie znaleziono jako pierwsze pole w dowolnym wierszuf1
.(trzeba powłokę ze wsparciem dla zastąpienia procesu, jak
ksh93
,zsh
lubbash
).źródło
Dla zabawy oto rozwiązanie w Perlu:
Przykład
Detale
Powyższe rozwiązanie Perla składa się z 2 pętli. Pierwsza pętla odczytuje wszystkie wiersze z
file1
i tworzy skrót, do%names
którego dodawana jest każda zidentyfikowana kolumna.Druga
while
pętla biegnie następnie nad drugim plikiem,file2
a kolumna 1 każdego wiersza jest identyfikowana za pomocą wyrażenia regularnego:Powyższe mówi od początku wiersza, dopasuj wszystko, co nie jest spacją, i zapisz je w zmiennej tymczasowej
$1
. Uratowano go, zawijając wokół niego pareny..*
Mówi dopasować wszystko inne na linii.Kolejny kawałek, że linie mówi zajrzeć do kolumny 1 bitu, że po prostu zapisane w
$1
w%names
hash:Jeśli tam jest, to nie chcemy go drukować. Jeśli go nie ma, wydrukuj go.
źródło
Metoda 1 # Bash
Metoda 2 # Tylko Grep
grep działa, ale nie gwarantuje
źródło
Zdobądźmy to jako
Plik nr 1: plik1.txt
Plik nr 2: plik2.txt
Następnie uruchom następujące na terminalu
output.txt będzie zawierać pożądane wyniki.
Wyjaśnienie:
źródło