Awk/Grep - 行から値を抽出し、ファイルデータと一致する場合は置換[検索->比較->置換]

Awk/Grep - 行から値を抽出し、ファイルデータと一致する場合は置換[検索->比較->置換]

長い行を含むファイルと参照データを含むファイルがあります。パーロンフレープ

私の目標は、特定のフィールドを検索することです。パーロン行はこれを次のすべての値と比較します。フレープ一致する場合は、指定された値に置き換えます。

デフォルトではファイル検索パーロン- 1行 - 異議申し立て4フレープ- すべての行 - フィールド 1.
一致する場合はフィールド 6 をフィールド 2 と比較し、一致する場合はフィールド 4 をフィールド 3 に置き換えます。 1 または 2 が一致しない場合は無視され、変更されません。

パーロン次のデータが含まれています。

Name|location|111|22|333|4444| |6666||8
Name|location| |56|67|| |6666||8

一部のフィールドは空白で、一部のフィールドにはスペースがありますが、すべてのフィールドは「|」で区切られます。

フレープ次のデータが含まれています。

574|5327|1000
22|4444|2000
67|77|3000

返品:

Name|location|111|2000|333|4444| |6666||8
Name|location| |56|67|| |6666||8

私はこれが機能で可能であることを知っていますが、人々がAwkで作業できる複雑さにショックを受けました。だから私はそれを使用しようとしましたが、どの文字列検索/エディタでも機能します。

ベストアンサー1

あなたの声明によれば、フィールド1と2をキーとしてハッシュ(関連付けの配列)を設定し、フィールド4と6をルックアップキーとして使用しRETURNたいと思います。FrefFlong

$ awk -F'|' '
    BEGIN{OFS = FS} 
    NR == FNR {a[$1 FS $2] = $3; next} 
    $4 FS $6 in a {$4 = a[$4 FS $6]} 
    1
' Fref Flong
Name|location|111|2000|333|4444| |6666||8
Name|location| |56|67|| |6666||8

おすすめ記事