2つのファイルの各レコード間のn個の列値を比較し、ファイル2のデータをファイル1に追加します。

2つのファイルの各レコード間のn個の列値を比較し、ファイル2のデータをファイル1に追加します。

次の入力ファイルがあります。

入力ファイルの例:

a|a1|a2|a3|a4|a5|...|a29|$2342
a|a1|a2|a3|a4|a5|...|a29|$2343
a|a1|a2|a3|a4|a5|...|a29|$2344
a|a1|a2|a3|a4|a5|...|a29|$2345
b|b1|b2|b3|b4|b5|...|b29|$100
c|c1|c2|c3|c4|c5|...|c29|$12

他のファイルのデータは次のとおりです。

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

以下に説明するように、これら2つのファイルを使用して最終出力を取得しようとしています。

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2343|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2344|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2345|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

以前の列の値を比較して#同じことが確認されたら、2番目のファイルの値を1番目のファイルに追加できると思いました。

ベストアンサー1

これは一般的な作業ですawk。考えられる解決策は次のとおりです。

awk '
NR==FNR {
    match($0,/.*\$/)
    pref = substr($0,RSTART,RLENGTH)
    rest = substr($0,RSTART+RLENGTH)
    suff = substr(rest, index(rest,"|"))
    suffixes[pref] = suff
    next
}
{
    match($0,/.*\$/)
    prefix = substr($0,RSTART,RLENGTH)
    match($0,/.*\$[0-9]+|/)
    data = substr($0,RSTART,RLENGTH)
    if (prefix in suffixes)
        print data suffixes[prefix]
}
' file2 file1

file1あなたの質問には「input file」というファイルはどこにあり、あなたの質問にはfile2「another file」というファイルはどこにありますか? (リスト内のファイルの順序を参照してください。)

説明する:

最初のコマンドブロックは、最初のファイルを読み取ると実行されますfile2。これはNR==FNR、最初のファイルを読み取る場合にのみ真の条件によって達成されます。 2番目のコマンドブロックは2番目のファイルに対してのみ実行されます(最初のコマンドブロックのコマンドfile1のため)。next最初のブロックはプレフィックスprefとサフィックスを抽出しsuffsuffixes[pref] = suff各プレフィックスに対応するサフィックスを記憶します。これは、2番目のブロックのデータを参照するために必要です。 2番目のブロックでは、同様のコマンドが実際に実行されてプレフィックスを抽出し、それを使用して保存されたサフィックスから正しいサフィックスを取得します。 1つの違いがあります。シンボルの後の数字も#新しいプレフィックスデータの一部として保持する必要があるため、配列matchにアクセスするために必要なプレフィックスsuffixesと結果データの一部になるために必要なプレフィックスを区別する2番目のタスクがあります。

おすすめ記事