2012-07-24 17 views
6

Ho uno script awk che si chiama da:Dichiarare una funzione awk in bash

awk -f myawkfile.awk arguments 

Lo script awk è chiamato nel mio script bash utilizzando la stessa chiamata menzionati.

Posso, invece di chiamare lo script awk dichiararlo come una funzione nel mio script bash . Ho pensato che sarebbe stato semplice scrivendo uno davanti e dietro, barrando l'intero codice, quindi assegnando un nome di funzione per chiamarlo a piacere. In qualche modo non fa il trucco.

Sto provando a farlo perché non voglio che il mio script abbia dipendenza da un altro script. E io non sono quello che ha scritto lo script awk. Prende un file come input, contiene alcuni elementi e restituisce il file modificato che è usato nel mio script.

+0

*** Perché *** non vuoi che lo script abbia dipendenza da un altro script? Preferirei attenermi a una lingua per file di script. Rende il test, la lettura e il mantenimento del *** molto più facile! – Johnsyweb

+0

Sì! hai ragione, ma l'esecuzione dello script in una cartella temporanea rende la dipendenza una responsabilità. – Gil

+0

Perché non installare lo script awk da qualche parte nel tuo '$ {PATH}'? – Johnsyweb

risposta

9

Utilizzando heredoc notation si può scrivere qualcosa del genere

#!/bin/bash 

awk_program=$(cat << 'EOF' 
    /* your awk script goes here */ 
EOF 
) 

# ... 

# run awk script 
awk "$awk_program" arguments 

# ... 
+0

Ottimo lavoro! Non ho mai saputo questo trucco :(Grazie a un compagno di tone! Mi ha salvato un sacco di tempo! – Gil

+1

Perché usare l'heredoc? Basta fare: 'awk_program = 'metti script qui'' –

+0

@WilliamPursell perché lo script che viene chiesto e che era rimosso dalla domanda contiene più di 20 righe. Inlining lo renderà illeggibile e impossibile da mantenere (potrebbe non essere necessario, ma è meglio preservare tale possibilità) – xaizek

2

Basta scrivere lo script awk in una funzione:

#!/bin/sh -e 

foo() { awk '{print $2}' "[email protected]"; } 
foo a b       # Print the 2nd column from files a and b 
printf 'a b c\nd e f\n' | foo # print 'b\ne\n' 

Si noti che lo standard awk sembra ambiguo sul comportamento se la stringa vuota è passato come argomento, ma la shell garantisce che "[email protected]" si espande a zero campi piuttosto che la stringa vuota, quindi è solo un problema se si invoca foo con un argomento vuoto.

+0

Non sono in grado di dichiarare il mio script awk come suggerito da te! – Gil

+0

@Geekasaur Perché no? Che errore stai ottenendo? –

Problemi correlati