awk не заканчивается

8

У меня есть следующий код в файле с именем awktest1.awk:

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

где employee.txtсодержит следующие данные:

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

Я запускаю awkкоманду как:

awk -f awktest1.awk

но это просто печатает startи не заканчивается. Может кто-нибудь помочь мне с тем, что я здесь делаю неправильно?

Сакет Агарвал
источник
2
Обратите внимание, что написав: print $2, "\t", $5вместо print $2 "\t" $5этого вы пишете 2-е поле, за которым следуют OFS (пробел), TAB, OFS и 5-е поле.
Стефан Шазелас

Ответы:

12

Ошибка дает имя файла для обработки в скрипте; Вы должны удалить employee.txtиз скрипта и запустить его следующим образом

awk -f awktest1.awk employee.txt

или даже, если скрипт исполняемый,

./awktest1.awk employee.txt

Сценарий становится

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

Как есть, awkожидает ввода от стандартного ввода вместо чтения из файла. Вот почему это никогда не заканчивается ...

Стивен Китт
источник
12

Чтобы дополнить ответ @ Stephen , если вы хотите жестко закодировать имя входного файла в awkсценарии, вы должны написать:

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

Для нескольких файлов:

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

Или, если вы не хотите передавать имя файла employee.txtв качестве аргумента командной строки, вы можете сделать что-то вроде этого:

Код:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 
нейрон
источник