一致に基づいてファイルのフィールドを別のファイルの別のフィールドに置き換えます。

一致に基づいてファイルのフィールドを別のファイルの別のフィールドに置き換えます。

この作業にご協力いただきありがとうございます。

ファイルAには4つのフィールドと90K行があります。次の条件がtrueの場合、最初のフィールド(列1)の値を変更する必要があります。 4番目のフィールド(列4)には、ファイルBで参照されているデータが含まれています。ファイルAのデータは、タブで区切られたDNSレコードです。

Owner IN Type RData

ファイルA:

hostname1 IN A 10.10.20.1 
hostname2 IN A 10.10.20.2 
hostname3 IN A 10.10.20.3

ファイルB:

10.10.20.1 
10.10.20.2 
10.10.20.58 
10.10.21.245 
10.10.23.7

ファイルBは単一の列(1つのフィールド)と1400の行です。ファイルBのデータはIPアドレスです。

要件:ファイルBの各行に対してファイルAの4番目のフィールドが一致する場合は、ファイルAの最初のフィールドの内容を置き換えます。

英語:ファイルBにリストされている各IPについて、ファイルAの所有者の値を特定の値に置き換えます。

ベストアンサー1

私の答えに従って修正されました。ここ...)

あなたは比較することができますNRそしてFNR最初のファイル処理と後続のファイル処理を区別します。これはFNR、リセットがファイル基準NRではなく実行回数基準であるためです。したがって、最初のファイルが処理されたときにのみ条件が満たされますNR==FNR

最初のプロセスFileB ...

awk 'NR==FNR{a[$1]=1}'

値を「dummy」のように設定すれば1十分です。

次にFileAを処理します。

awk -F'\t' 'BEGIN{OFS=FS}NR!=FNR{if(a[$4]){$1="Reserved"};print}'

ここでは、行全体()を書き換えるときに書式を維持するように出力フィールド区切り文字がOFS設定されています。FSawk$0

2つを組み合わせると、次のようになります。

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1}NR!=FNR{if(a[$4]){$1="Reserved"};print}' FileB FileA

もう少し欲しいなら簡潔...

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1;next}a[$4]{$1="Reserved"}1' FileB FileA

next処理のため最初1ファイルは実行者の最終印刷をスキップします{print $0}。このようにして、条件a[$4](つまりtrue存在する場合r)を「out」$1に変更する必要があるかどうかを判断する条件に置き換えることができます"Reserved"

おすすめ記事