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í?


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 ...


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"}

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"
} 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.