指示によると、スクリプト ファイルは次のコマンドを使用して当社のシステムでテストされます。
awk -f ./awk4.awk input.csv
次のファイルを受け入れて名前と学年のフィールドを出力するawkスクリプトを作成します。
どうやら、私は bash スクリプトを作成しましたが、これはコマンド ラインから awk -f で実行される awk スクリプトである必要があります。以下は私のコードです。すべてをやり直さずに bash スクリプトを awk スクリプトに変換する簡単な方法はありますか? 指示について本当に混乱しています。
#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' $1
答え1
awk スクリプトでは、内容はawk
コマンドとして提供されるものになります。この場合、次のようになります。
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
ただし、これでは使いにくくなる-F ,
ため、代わりにブロックFS
内に設定しますBEGIN
。
したがって、スクリプトは次のようになります。
#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
答え2
スクリプトを作成しましたawk
が、スクリプト内に配置しました。これがawk
スクリプトです:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
ファイルに保存しscript.awk
て次のように実行します
awk -F',' -f script.awk inputfile
ここで、スクリプトに関するヒントをいくつか紹介します。
awk
コマンドは のようになりますCONDITION {COMMAND(S)}
。CONDITION
が行 (レコード) に対して満たされる場合、{COMMAND(S)}
が実行されます。 がない場合CONDITION
、{COMMAND(S)}
がすべてのレコードに対して実行されます。 がない場合、 が満たされる{COMMAND(S)}
たびにレコードが印刷されます CONDITION
。
あなたの場合:
/./
は、任意の文字を含む行に一致する正規表現です。つまり、空行を除くすべての行に一致するので、条件としてはほとんど冗長です。" "
変数間の区切りとして使用し、,
デフォルト値を適用するために使用します,
スクリプトの最初の -block でセパレーターとしてusing を指定する必要がありますBEGIN
。
BEGIN {FS=","}
{print $1,$2}
出力区切り文字としてコンマも使用したい場合は、次のようにします。
BEGIN {FS=OFS=","}
{print $1,$2}
答え3
awk スクリプトは、 によって実行できる awk コマンドの集合ですawk
。awk スクリプトを書く方法は 2 つあります。
awk コマンドをテキスト ファイルに記述し、 で呼び出すだけです
awk -f /path/to/file.awk
。あなたの場合は次のようになります。/./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
次のように実行します:
awk -F, -f /path/to/file.awk inputFile
または、 を使用せずに のみで実行する必要がある場合は
awk -f ./path/to/file.awk inputFile
、-F,
スクリプト自体にフィールド区切り記号を設定します。BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
そして で実行します
awk -f /path/to/file.awk inputFile
。コマンドを記述しますが、どのインタープリターがスクリプトを読み取るかを指定するためにシェバンを使用します。あなたの場合、それは次のようになります:
#!/usr/bin/awk -f ## With this approach, you can't use -F so you need to set ## the field separator in a BEGIN{} block. BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
そして、スクリプトを実行可能 (
chmod a+x /path/to/file.awk
) にして、次のように実行します。/path/to/file.awk inputFile
これらは両方ともawkスクリプトです。3番目のオプションは、シェル代わりにスクリプトを使用して、シェル スクリプトで awk を実行します。次のようになります。
#!/bin/sh
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' "$1"
問題は、どちらでもないことでした。awk シェバンを使用していましたが、awk スクリプトではなくシェル スクリプトを使用していました。