2012-03-04 9 views
9

sto qualitativi divulgati uno script di shell che include un paio di righe awk

la linea awk si presenta come:

cat input.csv | awk -F, '$1~/$1/ {print "is good"}' 

la prima $1 è la prima colonna della csv ingresso, il secondo $1 dovrebbe essere il primo ingresso linea di comando di questo script shell

ho cercato di mettere un \ davanti alla seconda $, ma sembra essere non funziona.

Qualcuno può aiutare?

risposta

5
cat input.csv | awk -F, '$1~/'"$1"'/ {print "is good"}' 

è necessario chiudere la stringa ', inserire il guscio $1 (all'interno " nel caso ci sono caratteri speciali), quindi riaprire la stringa '.

E si consiglia di verificare se lo $1 dalla shell contiene / caratteri che sostituiranno l'espressione regolare con .

E come @Ignacio Vazquez-Abrams ha indicato, non è necessario inviare l'output di cat a awk, si può solo ottenere awk per leggere direttamente il file. Cioè:

cat input.csv | awk ... 

può essere semplificata:

awk ... < input.csv 
+1

Che in realtà non dice awk a leggere il file. Dice alla shell di alimentarla direttamente nello stdin di awk invece di usare cat. –

+0

@Ignacio Vazquez-Abrams: lo so ma non volevo troppe complicazioni. –

+0

@ IgnacioVazquez-Abrams Il reindirizzamento non "lo inserisce direttamente nello stdin di awk". Il file * diventa * awk's stdin. L'uso inutile di cat alimenta il contenuto del file allo stdin di awk e quell'I/O inutile è il motivo per cui UUOC è inefficiente. –

4

Una variabile è troppo fine.

awk -F, -v needle="$1" '$1 ~ needle {print "is good"}' < input.csv 
+0

Buona idea della variabile extra. Immagino che questo elimini qualsiasi problema in cui '$ 1' possa contenere caratteri speciali, vero? –

+5

Ogni personaggio è speciale a modo suo. –

1

cat o un reindirizzamento non è necessario. Ecco una terza variante utilizzando la barra rovesciata:

awk -F, "\$1~/$1/ {print \"is good\"}" input.csv 
Problemi correlati