Vergleichen Sie zwei Dateispalten

Vergleichen Sie zwei Dateispalten

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.txthat vier Spalten, hat zwei Spalten. Ich möchte die 1. Spalte ( ) in beiden Dateien ( , ) file2.txtvergleichen und die Datei ausgeben, die in nicht übereinstimmt .$1file1.txtfile2.txtfile2.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:

  • awkdruckt nur Feld 1 ausfile2.txt
  • grep -vinvertiert die Übereinstimmung (druckt nicht übereinstimmende Zeilen)
  • -f -weist an, grepdie Liste der Übereinstimmungsmuster aus einer Datei zu lesen, in diesem Fall -( STDIN), die vonawk

verwandte Informationen