ああ、まだ終わっていません。

ああ、まだ終わっていません。

次のファイルには次のコードがあります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終わりません。誰もが私がここで何を間違っているのかを理解できますか?

答え1

エラーは、処理するファイル名がスクリプトに記載されていることです。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ファイルから読み込むのではなく、標準入力の入力を待っています。だから終わりはありません...

答え2

補う@スティーブンの答え、スクリプトから入力ファイルの名前をハードコードするには、次のように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"}

答え3

employee.txtまたは、ファイル名をコマンドライン引数として渡したくない場合は、次のようにします。

パスワード:

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

関連情報