So drucken Sie, wenn eine Übereinstimmung vorhanden ist, und verlassen diese, wenn nicht, mit awk

So drucken Sie, wenn eine Übereinstimmung vorhanden ist, und verlassen diese, wenn nicht, mit awk

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.tsvin ein Wörterbuch mit den Schlüsseln $1, das Speichern des Inhalts der gesamten Zeile und die spätere Verwendung B.tsvzum 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 ENDnur 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

verwandte Informationen