Perché awk stampa l'intera riga quando voglio che stampi una variabile?


24

Quando scrivo:

echo "foo bar" | gawk -v var="content" '{print $var}'

Mi aspetto che l'output sia content. Perché è foo bar?


8
Prova a rimuovere $da $ var
taliezin il

Infatti. Mi sono confuso con la sintassi bash ...
Nicoco,

È una buona domanda e sebbene la risposta mostri che $era fuori posto non sono sicuro che debba essere chiuso come errore di battitura. Ne ho visti molti di questi di recente, quindi forse ne abbiamo bisogno di uno canonico
roaima,

Risposte:


45

Le variabili sono referenziate per nome come in var, non $varin awk. $nsi riferisce al campo nth : per il primo campo, per il secondo ... o l'intero record per == 0 ( è il record completo).$1$2n$0

Quelli non devono essere numeri letterali. Puoi usare $(1+1)o $variable. Se variablecontiene 1, allora $variablesarà il primo campo. Uno comunemente usato è $NFper l'ultimo campo ( NFè la variabile speciale che contiene il numero di campi).

Se, come nel tuo esempio, la variabile non contiene un numero, quel non-numero viene inteso come 0.

Quindi var="content"; print $var, è lo stesso var=0; print $var, e quindi lo stesso print $0, che è stampare l'intero record.

Quello che vuoi qui è:

echo "foo bar" | gawk -v var="content" '{print var}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.