awk no termina

8

Tengo el siguiente código en un archivo llamado awktest1.awk:

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"} employee.txt

donde employee.txtcontiene los siguientes datos:

100  Thomas  Manager    Sales  $5,000 
200  Jason   Developer  Technology  $5,500 
300  Sanjay  Sysadmin   Technology  $7,000 
400  Nisha   Manager    Marketing   $9,500 
500  Randy   DBA        Technology  $6,000

Ejecuto el awkcomando como:

awk -f awktest1.awk

pero solo imprime starty no termina. ¿Alguien puede ayudarme con lo que estoy haciendo mal aquí?

Saket Agarwal
fuente
2
Tenga en cuenta que al escribir: print $2, "\t", $5en lugar de print $2 "\t" $5, está escribiendo el segundo campo seguido de OFS (espacio), TAB, OFS y el quinto campo.
Stéphane Chazelas

Respuestas:

12

El error está dando el nombre de archivo para procesar en el script; debe eliminar employee.txtdel script y ejecutarlo de la siguiente manera

awk -f awktest1.awk employee.txt

o incluso, si el script es ejecutable,

./awktest1.awk employee.txt

El guión se convierte

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"}

Tal como está, awkestá esperando la entrada de la entrada estándar en lugar de leer de un archivo. Por eso nunca termina ...

Stephen Kitt
fuente
12

Para complementar la respuesta de @ Stephen , si desea codificar el nombre del archivo de entrada en el awkscript, escribiría:

#!/bin/awk -f
BEGIN{
  ARGC=2
  ARGV[1] = "employee.txt"
  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}

Para varios archivos:

#!/bin/awk -f
BEGIN{
  ARGC=1
  ARGV[ARGC++] = "employee1.txt"
  ARGV[ARGC++] = "employee2.txt"
  ARGV[ARGC++] = "employee3.txt"
  # ...

  # or ARGC=1+split("employee1.txt employee2.txt employee3.txt", ARGV)

  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}
Stéphane Chazelas
fuente
5

O si no desea pasar el nombre del archivo employee.txtcomo argumento de línea de comando, puede hacer algo como esto:

Código:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 
neurona
fuente