Ich habe lange Textdateien mit durch Leerzeichen getrennten Feldern:
cat file1.txt
Id leng sal mon
25671 34343 56565 5565
44888 56565 45554 6868
23343 23423 26226 6224
77765 88688 87464 6848
66776 23343 63463 4534
cat file2.txt
Id number
25671 34343
76767 34234
23343 23423
66776 23343
cat output.txt
Id leng sal mon
44888 56565 45554 6868
77765 88688 87464 6848
file1.txt
hat vier Spalten, hat zwei Spalten. Ich möchte die 1. Spalte ( ) in beiden Dateien ( , ) file2.txt
vergleichen und die Datei ausgeben, die in nicht übereinstimmt .$1
file1.txt
file2.txt
file2.txt
Ich habe versucht
join -v1 file1.txt file2.txt >output.txt
Die Ausgabe enthält jedoch einige Fehler. Jeder awk
/ sed
-Befehl ist willkommen.
Antwort1
Um zu verwenden join
, müssen Sie sicherstellen, dass FILE1 und FILE2sortiertauf den Verknüpfungsfeldern.
Der folgende Befehl sollte funktionieren:
join -v1 <(sort file1.txt) <(sort file2.txt)
Antwort2
So, allerdings ohne die Kopfzeile:
$ awk '{print $1}' file2.txt | grep -vf - file1.txt
44888 56565 45554 6868
77765 88688 87464 6848
Hinweis: Ich habe dies so angepasst, dass es der Beispielausgabe entspricht, nicht Ihrer Beschreibung. Wenn Sie es anders haben möchten, vertauschen Sie einfach Datei1 und Datei2.
Im Einzelnen:
awk
druckt nur Feld 1 ausfile2.txt
grep -v
invertiert die Übereinstimmung (druckt nicht übereinstimmende Zeilen)-f -
weist an,grep
die Liste der Übereinstimmungsmuster aus einer Datei zu lesen, in diesem Fall-
(STDIN
), die vonawk