2017-04-20 4 views
1

Ich habe folgende zwei Dateien, ich muss sie basierend auf dem Wert von drei Spalten verbinden, und wenn nicht übereinstimmte NA in der nicht übereinstimmenden Spalte drucken.Join zwei Dateien basierend auf drei Spalten

cat f1 
AAA 0 node4 Activated Unreachable down 
AAA 1 node3 Activated Pingable  cool 

cat f2 
AAA 0 node3 XYZ Active 

Derzeit fehlerhafte Ausgabe mit Ich erhalte:

awk 'NR==FNR{a[$1]=$1;b[$2]=$2;c[$3]=$3;next} $1 in a && $2 in b && $3 in c{print $0}' f1 f2 
AAA 0 node3 XYZ Active 

gewünschte Ausgabe:

AAA 0 node4 Activated Unreachable down NA 
AAA 1 node3 Activated Pingable cool Active 

Antwort

1

awk Ansatz:

awk 'NR==FNR{a[$1,$3]=$5; next}{$7="NA";if(($1,$3) in a){$7=a[$1,$3]} print}' f2 f1 

Der Ausgang:

AAA 0 node4 Activated Unreachable down NA 
AAA 1 node3 Activated Pingable cool Active 

a[$1,$3]=$5 - den Wert des fünften Feld speichert $5 in der zweiten Datei f2 der ersten Verwendung Kombination $1 und t hird $3 Felder als Arrayschlüssel

$7="NA"; - initiiert ein zusätzliches siebtes Feld $7 mit Standardwert „NA“

1

wie unten eine Awk Logik verwenden,

awk 'FNR==NR{hash[$1FS$3]=$NF; next}{for(i in hash) if (match(i,$1FS$3)) { $(NF+1)=hash[i] } else { $(NF+1)="NA" } }1' f2 f1 

die Ausgabe erzeugt als du brauchtest .

AAA 0 node4 Activated Unreachable down NA 
AAA 1 node3 Activated Pingable cool Active 

Die Idee ist, parse die zweite Datei zuerst den Status zu speichern, Index durch den Knotenwert in das Array hash. Dann auf der ersten Datei, eine Schleife auf allen Indizes und wenn der Wert in $3 auf f1 mit dem Hash-Wert übereinstimmt, drucken Sie den Status entsprechend und es nicht gefunden nur drucken NA.

Verwandte Themen