2013-02-22 22 views
8

Ho utilizzato uno script di bash (script.sh) che utilizza vari script awk (script1.awk, script2.awk) che sono personalizzati in "runtime", sostituendo i valori per esempio. Ho cercato modi per incorporarli completamente nel primo script di bash. Idealmente, vorrei avere un file simile a questo:Incorporamento awk in uno script di shell

################################ 
# AWK scripts     # 
################################ 
read -d '' scriptVariable <<'EOF' 
' 
{my block commands;} 
' 
EOF 
################################ 
# End of AWK Scripts   # 
################################ 
awk $scriptVariable ${inputfile} # This line obviously doesn't work 

al posto del tradizionale:

awk '{ 
my script commands 
' ${intputfile} 

Certo, li ho potuto scrivere su un file, ma il punto non è quello di . Eventuali suggerimenti ? EDIT: anche se le risposte dogbane funzionano bene, il problema successivo è che con i tag "HERE" < <, i caratteri di nuova riga non vengono letti. Non posso annullare la query poiché, in caso contrario, sta tentando di interpretare lo script awk quindi incontrando un segno $ all'interno (e ci sono). E senza nessuna nuova riga, non posso commentare nulla all'interno dello script awk (senza commentare metà dello script quando i caratteri di nuova riga vengono rimossi ...). Qualcuno?

<< 'EOF' 
BEGIN{#Hello 
print $1 
} 
EOF # Is read as BEGIN{#Hello print $1} by awk; ie BEGIN{ 

<< EOF 
BEGIN{#Hello 
print $1 
} 
EOF #Is read correctly by awk but Bash tried to express $1 and fails 
+0

Funziona con 'awk" $ scriptVariable "$ {inputfile}' – mouviciel

+0

Sembra che tu abbia semplicemente bisogno di aggiornare il tuo linguaggio di scripting a qualcosa di meglio - Perl o Python. Sarà più facile e lavorerà più velocemente. – mvp

+0

già provato, non è riuscito con 'awk: errore di sintassi a riga di origine 1 contesto è \t >>> '<<< awk: salvataggio sulla linea fonte 18' –

risposta

9

Rimuovere le virgolette singole attorno allo script awk e racchiudere la variabile di script tra virgolette. Questo funziona per me:

################################ 
# AWK scripts     # 
################################ 
read -d '' scriptVariable << 'EOF' 
BEGIN { 
    print "start" 
} 
{ 
    print $0 
} 
END{ 
    print "hello" 
} 
EOF 
################################ 
# End of AWK Scripts   # 
################################ 

awk "$scriptVariable" ${inputfile} 
+0

fa Grazie molto –

+0

per passare shell vars allo script awk, utilizzare l'opzione "-v" di awk Qualcosa come:. **' var v1 = "value guscio" awk -v awkVar =" $ v1 "" $ scriptVariable "$ {file di input} ' ** Nel tuo script, 'awkVar' manterrà il valore "valore di shell" – user1435666

0

È possibile includere il vostro awk all'interno dello script bash utilizzando un Here-Document.

+1

Un consiglio, usare l'opzione '-f -', come in 'awk -f - << EOD !! ' – cdarke

2

Le virgolette singole attorno agli script di awk possono essere irascibili in una shell.

echo dummy code | awk '/dummy/{print '$1' $2}' - another_file | while read LINE; do 
    case $LINE in 
     "$1 code")echo success;; 
     *)echo $LINE;; 
    esac 
done 

Questo eliminerà da stdin e quindi another_file e linee di uscita contenente manichino e sostituire il primo campo con il primo argomento allo script bash. Si noti che la variabile bash $ 1 doveva essere non quotata.

Problemi correlati