2016-07-27 13 views
0

arbeitet ich den folgenden Befehl versuchen:awk in while-Schleife nicht

while read file 
do 
awk -v ID="$file" '$1==ID{print $0}' input2 > output 
done < input1 

input1 wie folgt aussieht:

1 
2 
3 
4 

input2 wie folgt aussieht:

2 a b c 
3 a b c 
5 a b c 
6 a b c 

Die Ausgabe sollte wie folgt aussehen:

3 a b c 

Mit anderen Worten, wenn die erste Spalte der Datei input2 mit einem der Werte von file input1 übereinstimmt, möchte ich die gesamte Zeile von input2 ausgeben. Meine while-Schleife von oben produziert jedoch nur leere Dateien ... Was könnte das Problem sein? Danke vielmals!

Antwort

2

Ausgang bei jeder Iteration Verwendung zerstört wird >> statt> oder nur letzte Iteration zeigt

+0

Ah ja natürlich, danke! – Abdel

3

Sie das nicht tun, ist es enorm ineffizient ist und zerbrechlich (siehe https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice). Tun Sie dies stattdessen:

awk 'NR==FNR{ids[$0];next} $1 in ids' input1 input2 > output 
+1

+1! Bis vor kurzem dachte ich, dass awk nur eine Eingabedatei verarbeiten kann. Ich denke, dass die meisten Leute das auch ignorieren, daher die 'while read'-Konstruktion. –

+0

Ja, leider denken viele Leute an Awk als nur ein schickes Grep oder Sed. Es ist weit mehr als das - es ist ** das ** Standard-UNIX-Allzweck-Textverarbeitungswerkzeug. Ich empfehle jedem, der Text in UNIX manipulieren müsste, zuerst Effective Awk Programming, 4th Edition, von Arnold Robbins. Es wird wahrscheinlich ein Spiel verändern. –

+0

Definitiv, obwohl es jetzt etwas altmodisch wird, dass wir Python haben. BTW könnten Sie Ihren Oneliner erklären? Die Leute werden mehrere Eingabeströme mehr verwenden, wenn sie verstehen, wie es funktioniert. –