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

em que employee.txt conté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 corro o comando awk como:

awk -f awktest1.awk

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

    
por Saket Agarwal 09.08.2015 / 19:08

3 respostas

12

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

awk -f awktest1.awk employee.txt

ou mesmo, 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á, awk está aguardando entrada da entrada padrão em vez de ler de um arquivo. É por isso que nunca acaba ...

    
por 09.08.2015 / 19:12
11

Para complementar @resposta de Stephen , se você quiser codificar o nome do arquivo de entrada no script awk , você escreveria:

#!/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"}
    
por 09.08.2015 / 19:27
5

Ou se você não quiser passar o nome do arquivo employee.txt como um argumento de linha de comando, você pode fazer algo assim:

Código:

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