awk スクリプトについて混乱している

awk スクリプトについて混乱している

指示によると、スクリプト ファイルは次のコマンドを使用して当社のシステムでテストされます。

awk -f ./awk4.awk input.csv

次のファイルを受け入れて名前と学年のフィールドを出力するawkスクリプトを作成します。

タスク1

どうやら、私は 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

あなたの場合:

  1. /./は、任意の文字を含む行に一致する正規表現です。つまり、空行を除くすべての行に一致するので、条件としてはほとんど冗長です。

  2. " "変数間の区切りとして使用し、,デフォルト値を適用するために使用します

  3. ,スクリプトの最初の -block でセパレーターとしてusing を指定する必要がありますBEGIN


BEGIN {FS=","}
{print $1,$2}

出力区切り文字としてコンマも使用したい場合は、次のようにします。

BEGIN {FS=OFS=","}
{print $1,$2}

答え3

awk スクリプトは、 によって実行できる awk コマンドの集合ですawk。awk スクリプトを書く方法は 2 つあります。

  1. 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

  2. コマンドを記述しますが、どのインタープリターがスクリプトを読み取るかを指定するためにシェバンを使用します。あなたの場合、それは次のようになります:

    #!/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 スクリプトではなくシェル スクリプトを使用していました。

関連情報