2017-03-06 11 views
0

nahm ich Bezug zum Vergleichen von zwei Dateien folgenden Link: Compare files with awkVergleichen Sie zwei große Dateien mit awk

awk 'NR==FNR{a[$1];next}$1 in a{print $2}' file1 file2 

Es 2. Spalte von file2 druckt, wenn der 1. Spalte von Datei2 in Datei1 gefunden.

Aber meine Anforderung ist ein wenig anders. Wie wird die zweite Spalte von Datei1 gedruckt, wenn die erste Spalte von Datei2 im assoziativen Array gefunden wurde (mit der ersten Spalte von Datei1)?

Antwort

1

mit diesem:

awk 'NR==FNR{a[$1]=$2;next}$1 in a{print a[$1]}' file1 file2 

Mit dieser Art und Weise Sie einen Wert jedes Array-Element von a Array zuweisen. Für eine Zeile mit Feldern foo bar erstellen Sie tatsächlich a[foo]=bar.
Wenn Sie später einen Befehl {print a[foo]} geben wird es drucken bar (es zugewiesene Wert ist)

Der bisherige {a[$1];next} erstellt ein Array mit Namen a und Index $1, aber Wert ist null; Es ist ein stortcut von a[$1]="".

Das Ganze funktioniert in awk, weil awk eine einfache Möglichkeit hat, Indizes in einem Array mit $1 in a{print something} nachschlagen. Dies ist eine awk if then Abkürzung. Es ist das gleiche wie {if ($1 in a) {print something}}. Das Beste daran ist, dass der Teil $1 in a auf Array a Indizes und nicht Array-Werte verweist.

+0

Können Sie erklären "a [$ 1] = $ 2;" Schritt? Ich bin nicht in der Lage, es zu bekommen, was du tust. Aber deine Lösung hat für mich funktioniert. –

+0

@Spartacus Ist es jetzt klar? Es ist nur ein Wert, der dem Array zugewiesen wird und dann das Array druckt. –

+0

Ja, vielen Dank –

Verwandte Themen