2016-03-27 2 views
0

Ich habe 2 Textdateien. „A.txt“ enthältLeerzeichen mit awk entfernen, wenn der Wert von 1 TXT-Datei an einen anderen angehängt wird?

A 1 AB ... 1 5 -3 4.5 (contains 11 columns. So "4.5" is in the 11th column) 
A 2 BC ... -2 3 8 9.2 
A 3 WE ... 2 3 8 5.2 
A 4 RT ... 23 2 24 4.1 
... 
END 

„B.txt“ ähnlich ist, außer dass die letzten 2 Spalten von dem der „A.txt“ unterscheiden. Ein weiterer Unterschied ist, dass "B.txt" einige zusätzliche Zeilen enthält, die nicht in "A.txt" enthalten sind. Zum Beispiel ist die dritte Zeile A 3 QEW ... 5 23 34 5 in „B.txt“, aber nicht in „A.txt“

A 1 AB ... 1 5 4 9 
A 2 BC ... -2 3 1 0 
A 3 QEW ... 5 23 34 5 
A 4 WE ... 2 3 -7 56 
A 5 RT ... 23 2 -5 14 
... 
END 

Was möchte ich tun, ist, den Wert der letzten Spalte in jeder Zeile von „A.txt extrahieren "und an die entsprechende Zeile in" B.txt "anhängen. Und für jede Zeile in "B.txt", die nicht in "A.txt" ist, möchte ich den Wert 1 anhängen, wenn das dritte Spaltenelement mit dem Buchstaben "Q" (zB QEW) beginnt und andernfalls der Wert 2 . So sollte die Ausgabe aussehen

A 1 AB ... 1 5 4 9 4.5 
A 2 BC ... -2 3 1 0 9.2 
A 3 QEW ... 5 23 34 5 1 
A 4 WE ... 2 3 -7 56 5.2 
A 5 RT ... 23 2 -5 14 4.1 
... 
END 

Die awk Befehle unten Werke:

NR==FNR{ 
    arr[$3] = $11 
    next 
} 
{ 
    if ($3 in arr){ 
     print($0, arr[$3]) 
    }else if ($3 == "^Q"){ 
     print($0, "2") 
    }else{ 
     print($0, "1") 
    } 
} 

Ran mit

awk -f script.awk f1 f2 

Das einzige Problem ist, dass die Ausgabe ich erhalte, ist

A 1 AB ... 1 5 4 9 
4.5 
A 2 BC ... -2 3 1 0 
9.2 
A 3 QEW ... 5 23 34 5 
1 
A 4 WE ... 2 3 -7 56 
5.2 
A 5 RT ... 23 2 -5 14 
4.1 
... 
END 

, was falsch ist, weil die Werte in der letzten Spalte in neue Zeilen wie diese eingegeben werden sollten. Wie kann ich das beheben? Gibt es einen anderen Befehl, den ich anstelle dessen, was ich aufgelistet habe, verwenden kann?

Antwort

0

Ihr Code und Spezifikation für Q nicht übereinstimmt, wie auch immer, hier ist ein Skript, das in der Regel

$ awk 'NR==FNR{a[$3]=$NF; next} 
     $3 in a{print $0, a[$3]; next} 
       {print $0, ($3~/^Q/)?1:2}' f1 f2 

Druck funktioniert nicht als Funktion geschrieben wird, mehr idiomatische ist print $0,1 auch keine Notwendigkeit 1 zu zitieren und 2.

+0

Wenn ich das versuche, bekomme ich immer noch das Newline-Problem, das ich in der ursprünglichen Frage erwähnt – user5739619

+0

Versucht Dos2unix? – karakfa

Verwandte Themen