この作業にご協力いただきありがとうございます。
ファイル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
設定されています。FS
awk
$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"
。
答え2
次の方法でこれを実行できますawk
。
awk -F"\t" '{if(NF==1){arr[$1]=$1}else{if(arr[$4]==$4){$1="Reserved"}{print $0}}}' fileB, FileA
定数変数は
NF
ファイル内のフィールド数を表します。このコードでは、awk
FileBが最初に読み込まれ、すべてのデータがarr
FileAに指定された配列に格納されます。 4番目のフィールド$4
=配列値(IPアドレス)の場合は、ホスト名を予約済みに置き換えます。
サンプルから以下が出力されます。
Reserved IN A 10.10.20.1
Reserved IN A 10.10.20.2
hostname3 IN A 10.10.20.3