awk não termina

8

Eu tenho o seguinte código em um arquivo chamado awktest1.awk:

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

onde employee.txtcontém os seguintes dados:

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

Eu executo o awkcomando como:

awk -f awktest1.awk

mas apenas imprime starte não termina. Alguém pode me ajudar com o que estou fazendo de errado aqui?

Saket Agarwal
fonte
2
Observe que, escrevendo: print $2, "\t", $5ao contrário print $2 "\t" $5, você está escrevendo o segundo campo seguido de OFS (espaço), TAB, OFS e o quinto campo.
Stéphane Chazelas

Respostas:

12

O erro está fornecendo o nome do arquivo para processar no script; você deve remover employee.txtdo script e executá-lo da seguinte maneira

awk -f awktest1.awk employee.txt

ou ainda, se o script for executável,

./awktest1.awk employee.txt

O script se torna

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

Como está, awkestá aguardando a entrada da entrada padrão em vez de ler um arquivo. É por isso que nunca acaba ...

Stephen Kitt
fonte
12

Para complementar a resposta de @ Stephen , se você quiser codificar o nome do arquivo de entrada no awkscript, escreva:

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

Para vários arquivos:

#!/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
fonte
5

Ou, se você não deseja passar o nome do arquivo employee.txtcomo argumento da linha de comando, pode fazer algo assim:

Código:

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