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

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

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

awk -f ./awk4.awk input.csv

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

タスク1

明らかに、awk -fを使用して、コマンドラインで実行できるawkスクリプトでなければならないbashスクリプトを作成しました。以下は私のコードです。すべてを再実行せずに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. ,スクリプトの初期ブロックに区切り文字として使用を提供する必要がありますBEGIN


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

出力区切り文字としてカンマを使用するには、次のようにします。

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

答え3

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. コマンドを作成するがshebangを使用してスクリプトを読み取る必要があるインタプリタを指定します。あなたの場合は次のようになります。

    #!/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 shebangを使用していますが、awkスクリプトの代わりにシェルスクリプトを使用しています。

関連情報