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.