2009-09-13 9 views
16

Ho uno script awk che ho definito così:Richiamo uno script, che ha uno shebang awk, con parametri (VAR)

#!/usr/bin/env awk 
BEGIN { if (!len) len = 1; end = start + len } 
{ for (i = start; i < end; i++) { print $1 } } 

Ho salvato come columns e chmod +x 'd esso. Voglio invocarlo in modo che start e end siano definiti mentre attraversa un file. Stavo pensando che questo dovrebbe funzionare:

cat some_file | columns -v start=2 

Ma non è così. Aiuto!

risposta

33

Prova con:

#!/usr/bin/awk -f 

come interprete

+0

+1 per la soluzione più portatile, in quanto utilizza un solo argomento. Anche se il percorso per "awk" è hard-coded - di necessità, a causa di doversi accontentare di un argomento _one - questo dovrebbe funzionare su tutte le moderne piattaforme Unix. (Dillo se sai di dove non sia.) – mklement0

+1

@ mklement0 Non sul mio (NixOS). Poiché NixOS mantiene tutti i pacchetti isolati e su percorsi non standard. Penso che usare la risposta di mss sarebbe meglio nel mio caso. ** MODIFICA ** Non funziona perché '-S' non è conforme a POSIX :( –

+0

@PallavAgarwal: Buono a sapersi su come differisce NixOS. Si noti che finché il sistema operativo è in grado di gestire _multiple_ token sulla linea shebang, sei bravo, in altre parole: '#!/usr/bin/env awk -f' _may_ lavora per te (funziona su OS X, per esempio, ma non su Linux). – mklement0

4

env è il modo più semplice per gestire questo problema:

#!/usr/bin/env -S awk -f 

per aggiungere altre opzioni, e per garantire l'assenza di interferenze con il tuo argomenti e argomenti di awk:

#!/usr/bin/env -S awk -F: -f ${_} -- 
BEGIN { 
    # delete argv[1], which == ENVIRON[_] 
    delete ARGV[1] 
} # rest of my awk program 

come env ha uno standard POSIX, questo shbang dovrebbe farti superare le difficoltà di implementazioni shbang non standard su unixen.

EDIT

dopo aver scritto questo mi sono reso conto che '-S' è un non-POSIX compliant FreeBSD ENV estensione. Quindi, l'involucro di shell è probabilmente la strada da percorrere, sfortunato com'è.

+8

Grazie per aver sottolineato che '-S' non è standard . – dubiousjim

0

Sotto è la risposta a questo problema -

#!/bin/awk -f 
Problemi correlati