2009-09-13 14 views
16

tengo un script awk que he definido de este modo:Invocación de una secuencia de comandos, que tiene una shebang awk, con parámetros (VARs)

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

He guardado como columns y chmod +x 'd ella. Quiero invocarlo para que start y end se definan a medida que cruza un archivo. Estaba pensando que esto debería funcionar:

cat some_file | columns -v start=2 

Pero no es así. ¡Ayuda!

Respuesta

33

Intente utilizar:

#!/usr/bin/awk -f 

como intérprete

+0

+1 para la solución más portátil, ya que sólo se utiliza un único argumento. A pesar de que el camino a 'awk' está codificado, por necesidad, debido a tener que conformarse con un argumento, esto debería funcionar en todas las plataformas modernas de Unix. (Dígale si sabe de dónde no.) – mklement0

+1

@ mklement0 No es mío (NixOS). Como NixOS mantiene todos los paquetes aislados y en rutas no estándar. Creo que usar la respuesta de mss sería mejor en mi caso. ** ** EDITAR que no funciona bien desde '-S' no es compatible con POSIX :( –

+0

@PallavAgarwal:. Es bueno saber acerca de cómo difiere NixOS Tenga en cuenta que mientras su sistema operativo puede manejar _múltiples_ fichas en la línea shebang, usted es bueno, en otras palabras: '#!/usr/bin/env awk -f' _may_ trabajo para usted (funciona en OS X, por ejemplo, pero no en Linux). – mklement0

4

env es la forma más fácil de manejar este problema:

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

para añadir más opciones, y para asegurar que no haya interferencias con su argumentos y argumentos de awk:

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

ya que env tiene un estándar POSIX, este shbang debería ayudarle a superar las dificultades de las implementaciones de shbang no estándar en unixen.

EDITAR

después de haber escrito este me di cuenta que '-S' es un no compatible con POSIX FreeBSD extensión env. Así que la envoltura de conchas es probablemente el camino a seguir, desafortunada como es.

+8

Gracias por señalando que '-S' no es estándar . – dubiousjim

0

A continuación se muestra la respuesta para este problema -

#!/bin/awk -f 
Cuestiones relacionadas