
Ich habe eine Ergebnisdatei A.tsv
(Trennzeichen = \t
):
BC01 2551 99
BC03 2547 95
BC04 2578 99
BC05 2547 97
Und eine Datei mit Beispielinformationen B.tsv
(Trennzeichen = \t
):
BC01
BC04
BC02
BC03
BC05
Und ich möchte die Beispiele ergänzen A.tsv
(aber in einer neuen Datei drucken), die in Folgendem fehlen B.tsv
:
BC01 2551 99
BC02
BC03 2547 95
BC04 2578 99
BC05 2547 97
Bisher habe ich einige Awk-Befehle ausprobiert, aber nichts schlüssiges Ergebnis:
awk -v OFS="\t" 'NR==FNR{a[$1]=$1;next}{print $0};NR!=FNR{a[$1]=$1;next}{print $1}' B.tsv A.tsv > C.tsv
Wissen Sie, wie das geht?
Antwort1
Ein richtiger Ansatz zur Verarbeitung dieser Dateien wäre die Dekodierung A.tsv
in ein Wörterbuch mit den Schlüsseln $1
, das Speichern des Inhalts der gesamten Zeile und die spätere Verwendung B.tsv
zum Nachschlagen der Werte, d. h.
awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next }
( $1 in arr ){ print arr[$1]; next } { print $1 }' A.tsv B.tsv
Wenn Sie das Endergebnis nach sortiert haben möchten $1
, müssen Sie möglicherweise den Inhalt beider Dateien indizieren und ihn schließlich verarbeiten, indem Sie END
nur den Schlüssel drucken, wenn kein Wert vorhanden ist.
awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next }
!( $1 in arr ) { arr[$1] } END { for (x in arr) print arr[x] ? arr[x] : x }' A.tsv B.tsv