1

テキスト ファイルを処理する AWK スクリプトを作成しましたが、最初のファイルのフィールドに基づいて、処理からの出力が別のファイルからデータを取得するように拡張する必要があります。これが私の言いたいことの例です。

File1.txt

abc123~17~yy~12345678
abc456~12~yy~23456789
abc789~34~zz~12345678

File2.txt

abc123~11~22~33~ABC-57
abc456~22~11~33~ABC-99
abc789~33~22~11~ABC-12

私の現在のawkスクリプトは、4番目のフィールドが「12345678」であるFile1.txtから各行を抽出して処理するため、2行が見つかります。

これを拡張したいので、見つけた行から、

abc123~xx~yy~12345678

abc123 を取得して File2.txt で検索し、その行の 4 番目のフィールドも出力します。

例えば。私の awk スクリプトは、File1.txt のフィールド 4 でトークンを検索し、フィールド 1 で long を出力し、File2.txt のフィールド 4 で、File1.txt のフィールド 1 に関連する行を出力します。

したがって、12345678 を検索している場合、出力は次のようになります。

12345678 abc123 ABC-57 17
12345678 abc789 ABC-12 34

(17 と 34 は File1.txt のフィールド 2 から来ています)。

要約すると、File1.txt の Field 4 で文字列を検索し、File1.txt の Field 1 が File1.txt の Field 1 と一致する File2.txt の行を見つけます。次に印刷

ファイル.フィールド4 ファイル1.フィールド1 ファイル2.フィールド4 ファイル1.フィールド2

それが明確であることを願っています。

File2.txt の「abc123」文字列を grep してから、4 番目のフィールドを選択しようとしました。これは機能していないように見えましたが、フィールド 1 にインデックスを付けてフィールド 4 を格納する File2.txt の AWK 配列が機能する可能性があると思います。

ただし、これについてどうすればよいかわかりません。

(注意してください、これは私がやりたいことの簡略化された例です。私の実際の要件は、ファイルにもっと多くのデータがあります)。

4

2 に答える 2

3

このワンライナーでうまくいきます:

$ awk -F'~' -v s='12345678' 'FNR==NR&&$4==s{a[$1];next}($1 in a){print s,$1,$5}' file1 file2
12345678 abc123 ABC-57
12345678 abc789 ABC-12

説明:

~オプションを使用してフィールドセパレータを設定し、オプションを使用して一致させたい文字列に-F変数の値を設定します。s-v

いくつかの説明コメントを含むスクリプトとして:

BEGIN { FS="~" }    # Set the field separator. 
FNR==NR && $4==s {  # If we are in the first file and fourth field equals s 
    a[$1]           # Create index of field one
    next            # Skip to next line
}
($1 in a) {         # If field one in file2 is in index
    print v,$1,$5   # Print v, field 1 and field 5 
}

のように実行しますawk -v '12345678' -f script.awk file1 file2

于 2013-04-15T14:06:36.403 に答える
3

これは私が望んでいた解決策のようです。

BEGIN { FS="~" }               # Set the field separator. 
FNR==NR && $4==s {             # If we are in the first file and fourth field equals s 
    a[$1]                      # Create index of field one
    field2[$1]=$2

    next                       # Skip to next line
}
($1 in a) {                    # If field one in file2 is in index
    print s,$1,$5,field2[$1]   # Print v, field 1 and field 5 
}

それは正しいと思います。

解決策の私の理解はこれです。最初にコードの最初のブロックで File1 を処理し、必要なデータを配列に格納できます。

次に、$1 が配列 a にあるという条件付きで、コードの 2 番目のブロックでファイル 2 を処理します。そうであれば、データを出力し、ファイル 1 から field2 配列にアクセスします。

問題は解決し、私の実際の AWK スクリプトはうまく機能します。

助けてくれてありがとう。

于 2013-04-15T15:01:38.710 に答える