2016-05-04 17 views
1

Ich habe diese Bash-Anweisung zum Drucken einer bestimmten Zelle aus einer .csv-Datei.Kann ich eine Variable als Parameter für AWKs {print} verwenden?

set `cat $filename | awk -v FS=',' '{print $2}' | head -5 | tail -n 1` 

Der '{print $2}' Teil bestimmt die Spalte und der head -5 Teil bestimmt die Zeile.

Kann ich eine $counter Variable anstelle von $2 (z. B. '{print $counter}') ersetzen?

+1

Ja. Beachten Sie auch, dass Ihre Pipe über 'cat' ein wenig nutzlos ist, da' awk' sowieso einen Dateinamen als Eingabe verwendet. – Bernhard

+0

'head -5' ... muss durch' head -n 5' ersetzt werden –

+0

Wenn Sie 'counter' nicht setzen, wird '$ 0' ausgedruckt (weil' counter' als 0 behandelt wird). Wenn Sie 'counter' auf eine Spaltennummer setzen, wird' print $ counter' die Spaltennummer ausgeben, die durch den aktuellen Wert von 'counter' zum Zeitpunkt der Ausführung des' print' angezeigt wird. Sie können also die Spalte N der Eingabe mit 'N = 5; awk -v N = "$ N" '{print $ N}' '(für N = 5 in diesem Beispiel). –

Antwort

1

Die Antwort ist "Ja" - und es gibt ein paar Möglichkeiten zu tun, was Sie wollen. Der richtige Weg ist eine awk Variable -v zu deklarieren:

awk -F',' -v c=$counter 'NR==6 { print $c; exit }' "$filename" 

(Sie mir einige Dinge verzeihen um für die Bewegung alles in awk zu tun, für die Weitergabe "$filename" zu awk sicher, und für loswerden von set und zurück ticks - das taten nichts für die Ursache.)

Eine andere Möglichkeit, dies zu tun ist ein bisschen ein "hackish" Weg - Shell-Zitat Regeln zu nutzen. Dieses Verfahren erfordert, dass der erste $ Charakter, um sicherzustellen, einige entkommen (das verweist auf das beabsichtigte Feld in awk) nicht von der Shell interpretiert ... Die folgenden Arbeiten in bash (und POSIX sh):

awk -F',' "NR==6 { print \$$counter; exit }" "$filename" 
+0

Ist es nicht enough: 'NR == 6 {print $ c; Ausfahrt; } '? –

+0

Es ist :) ... guter Vorschlag! Ich werde meine Antwort ändern .... –

+0

Vielen Dank für die Reduzierung der Redundanz meines Codes. Ich habe viel gelernt. – jeremybcenteno

0

Ja und alle Rohre konnten entfernt werden. Variablen werden an awk mit -v var=value übergeben.

Probieren Sie diese getestete Version aus. Geben Sie einen Wert für die col und row Variablen:

set $(awk -F "," -v col=2 -v row=5 'NR==row {print $col; exit}' "${filename}") 

$(command) zu `command` bevorzugt wird, das später ist veraltet.

NR ist die aktuelle Zeilennummer.

"${filename}" wird von der Shell auf seinen Wert erweitert: die doppelten Anführungszeichen helfen, wenn der Dateiname einige Sonderzeichen enthält.

+0

Antwort aktualisiert mit einer getesteten Version, kopiert + eingefügt von Shell-Terminal. –

Verwandte Themen