awk tidak berakhir

8

Saya memiliki kode berikut dalam file bernama awktest1.awk:

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

di mana employee.txtberisi data berikut:

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

Saya menjalankan awkperintah sebagai:

awk -f awktest1.awk

tetapi hanya mencetak startdan tidak berakhir. Adakah yang bisa membantu saya dengan kesalahan saya di sini?

Saket Agarwal
sumber
2
Perhatikan bahwa dengan menulis: print $2, "\t", $5sebagai lawan print $2 "\t" $5, Anda sedang menulis bidang ke-2 diikuti oleh OFS (spasi), TAB, OFS dan bidang ke-5.
Stéphane Chazelas

Jawaban:

12

Kesalahannya adalah memberikan nama file untuk diproses dalam skrip; Anda harus menghapus employee.txtdari skrip dan menjalankannya sebagai berikut

awk -f awktest1.awk employee.txt

atau bahkan, jika skrip dapat dieksekusi,

./awktest1.awk employee.txt

Script menjadi

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

Saat ini, awksedang menunggu input dari input standar alih-alih membaca dari file. Itu sebabnya tidak pernah berakhir ...

Stephen Kitt
sumber
12

Untuk melengkapi jawaban @ Stephen , jika Anda ingin meng-hardcode nama file input dalam awkskrip, Anda akan menulis:

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

Untuk beberapa file:

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

Atau jika Anda tidak ingin memberikan nama file employee.txtsebagai argumen baris perintah, Anda dapat melakukan sesuatu seperti ini:

Kode:

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