ARGVを使用してAwkスクリプトからユーザー入力を取得する[閉じる]

ARGVを使用してAwkスクリプトからユーザー入力を取得する[閉じる]

ARGV[i]ユーザー入力を保存するために使用できることを知っています。しかし、awkスクリプトでそれを使用し、ARGV[i]他のテキストファイルのフィールドを比較したいと思います。フィールドが一致するか、ARGV[i]フィールドにARGV[i]ユーザー入力が含まれている場合は、行の他のフィールドを返したいと思います。

ファイルがあるとしましょうtesting.txt

123123123:Walter White:1:2:3:4
123123124:Jesse Pinkman:1:3:4:1

これは私のawkスクリプトですawkScript.awk

 #!/usr/bin/awk -f
    BEGIN{FS = ":"; print "ENTER A NAME: "}
    {
        for (i = 1; i < ARGC; i++)
        {   
            if ($2 ~ /'ARGV[i]'/)
            {
                print "Member ID: " $1
            }
        }
    }

スクリプトファイルを実行すると、ENTER A NAME:が印刷されます。ユーザーから入力を受け取りません。

答え1

ARGV[i]テストを次の変更に必要なものと一致させるには

if ($2 ~ ARGV[i])

'ARGV[i]'それ以外の場合は、目的のものではなくリテラル正規表現と一致するかどうかをテストします。

その後、次のようにスクリプトを実行すると(やや)動作します。

awk -f qtest.awk testing.txt "Jesse Pinkman" "Walter White"

ただし、test.txtを読み終えて「Jesse Pinkman」ファイルを開こうとすると、エラーが発生します(もちろん、その名前のファイルがある場合を除く)。

つまり、ARGV には以下が含まれます。ファイル名スクリプトはシェルによって渡されるため、これを使用して任意の引数を渡すことはできません。ファイル以外のパラメータをawkスクリプトに渡す一般的な方法は、構文を使用して-v var = valスクリプト内の変数を初期化することです。

しかし、ここでより良いアプローチは、BEGINブロックからtest.txtを読み込み、構文を使用しgetline var <namefile.txt、データを分割し(split()関数を使用して)、分割されたデータを2D配列に格納することです。その後、メイン処理ループはファイルまたはユーザーから名前を読み取ることができ、配列に格納されているデータを使用してテストできます。

関連情報