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番目のフィールドが続いていることに注意してください。
ステファンChazelas

回答:


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"
} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.