GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man zwei Dateien mit AWK zusammenführen?

Zum Glück müssen Sie das überhaupt nicht schreiben. Unix hat einen Join-Befehl, der dies für Sie erledigt.

join -1 1 -2 1 File1 File2

Hier ist es "in Aktion":

will-hartungs-computer:tmp will$ cat f1
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1
will-hartungs-computer:tmp will$ cat f2
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6
will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
will-hartungs-computer:tmp will$ 

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
4046 S00344 31322 4000 1

Erklärung:(Teilweise basierend auf einer anderen Frage. Allerdings etwas spät.)

FNR bezieht sich auf die Datensatznummer (normalerweise die Zeilennummer) in der aktuellen Datei und NR bezieht sich auf die Gesamtzahl der Datensätze. Der Operator ==ist ein Vergleichsoperator, der wahr zurückgibt, wenn die beiden umgebenden Operanden gleich sind. Also FNR==NR{commands} bedeutet, dass die Befehle in den Klammern nur während der Verarbeitung der ersten Datei ausgeführt werden (file2 jetzt).

FS bezieht sich auf das Feldtrennzeichen und $1 , $2 usw. sind das 1., 2. usw. Feld in einer Zeile. a[$1]=$2 FS $3 bedeutet, dass ein Dictionary(/array) (mit dem Namen a ) wird mit $1 gefüllt Schlüssel und $2 FS $3 Wert.

; trennt die Befehle

next bedeutet, dass alle anderen Befehle für die aktuelle Zeile ignoriert werden. (Die Verarbeitung wird in der nächsten Zeile fortgesetzt.)

$0 ist die ganze Zeile

{print $0, a[$1]} druckt einfach die ganze Zeile und den Wert von a[$1] (wenn $1 steht im Wörterbuch, sonst nur $0 gedruckt wird). Jetzt wird es nur noch für die 2. Datei ausgeführt (file1 jetzt), wegen FNR==NR{...;next} .


Sie müssen die Einträge aus Datei 2 in ein Paar assoziativer Arrays im BEGIN-Block einlesen. Angenommen GNU Awk:

BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }

Im Hauptverarbeitungsblock lesen Sie die Zeile aus Datei 1 und drucken sie mit den richtigen Daten aus den im BEGIN-Block erstellten Arrays:

{ print $0, f[$1], g[$1] }

Geben Sie Datei 1 als Dateinamenargument an das Programm an.

awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
     print $0, f[$1], g[$1] }' "File 1"

Die Anführungszeichen um das Dateinamenargument werden wegen der Leerzeichen im Dateinamen benötigt. Sie benötigen die Anführungszeichen um den getline Dateiname, auch wenn er keine Leerzeichen enthält, da er sonst ein Variablenname wäre.


Linux
  1. So laden Sie Dateien mit dem Dateimanager in Cpanel hoch

  2. wget vs curl:So laden Sie Dateien mit wget und curl herunter

  3. Führen Sie manuell zwei Dateien mit diff zusammen

  4. Führen Sie zwei HTML-Dateien in eine Master-HTML-Datei zusammen

  5. Wie kann ich viele MP3-Dateien zusammenführen/zusammenführen?

So löschen Sie leere Zeilen in Dateien mit Grep, Sed und Awk

So vergleichen Sie Dateien unter Linux mit dem Tool Meld (Diff/Merge).

Gewusst wie:Eine Einführung in die Verwendung von Git

Übertragen Sie Dateien mit WinSCP

Wie man Dateien mit dem Vim-Editor in Ubuntu mit einem Passwort schützt

So komprimieren Sie eine Datei unter Linux