2016-04-23 34 views
0

Ich habe zwei Dateien. Wenn Feld-9 von File-1 und Feld-1 von File-2 gleiches werden dann ersetzen Feld 1 von File-1 mit Feld 2 von File-1Vergleichen und Ersetzen von Feldern mit awk

file1:

12345||||||1000||756432|||| 
aaaaa||||||986754812345||986754|||| 
ccccc||||||134567222222||134567|||| 

file2:

756432|AAAAAAAAAAA 
986754|20030040000 

Die erwartete Ausgabe lautet:

12345||||||AAAAAAAAAAA||756432|||| 
aaaaa||||||20030040000||986754|||| 
ccccc||||||134567222222||134567||| 

ich diesen Code versucht

awk -F"|" 'NR==FNR{a[$1]=$2} NR>FNR{$7=a[$2];print}' OFS='|' file2 file1 

, aber anstatt das Feld zu ersetzen, wird es gelöscht.

Antwort

2

Sie verwenden die falsche Spalte als Index des Arrays im zweiten Block, und Sie suchen nicht nach fehlenden Schlüsseln. Dies erzeugt die Ausgabe, die Sie geschrieben:

awk -F '|' -v OFS='|' 'NR==FNR{a[$1]=$2;next}$9 in a{$7=a[$9]}1' file2 file1 
+0

Vielen Dank für Ihren Vorschlag, Könnten Sie bitte eine [$ 9] = "erklären!" – SGS

+0

@SGS: Sicher, mit 'a [$ 9] = ""' wir testen, ob Das Array 'a' enthält einen Wert für die Zeichenfolge, die im Feld $ 9 dargestellt wird. Daher ändern wir nur den Wert von $ 7, wenn der entsprechende Wert in Datei2 gefunden wird. – user000001

+0

Anstatt 'a [$ 9]! =" "' Könnte man '$ 9 in a' in Betracht ziehen. Mit ersteren fügt awk tatsächlich ein Array-Element mit $ 9 als Index und leerem Wert hinzu. Letzteres überprüft einfach, ob es da ist, ohne zusätzlichen Speicher zu verwenden. Normalerweise ist es in jedem Fall in Ordnung, aber es ist gut, den Unterschied zu berücksichtigen, wenn große Dateien beteiligt sind. – jas

Verwandte Themen