次のファイルには次のコードがあります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"
}