感谢对此任务的任何帮助:
文件 A 有 4 个字段,有 90K 行。如果满足以下条件,则第一个字段(第 1 列)的值需要更改。第四个字段(第 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 是单列(一个字段)和 1400 行。文件B中的数据是IP地址。
要求:对于文件 B 中的每一行,如果文件 A 中的第四个字段匹配,则替换文件 A 中第一个字段的内容。
英语:对于文件 B 中列出的每个 IP,将文件 A 中的所有者值替换为特定值。
答案1
(根据我的答案修改这里...)
你可以比较一下NR
和FNR
区分处理第一个文件或后续文件。这是因为FNR
是按文件重置,而NR
是运行计数。因此,只有在处理第一个文件时才会NR==FNR
满足条件。
首先处理 FileB...
awk 'NR==FNR{a[$1]=1}'
将值设置为“虚拟”之类的值1
就足够了。
然后,处理 FileA...
awk -F'\t' 'BEGIN{OFS=FS}NR!=FNR{if(a[$4]){$1="Reserved"};print}'
此处,输出字段分隔OFS
符设置为在重建整行 ( )FS
时保留格式。awk
$0
将两者放在一起:
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
用于处理第一的文件跳过 (the Final) 指示的最终打印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
=数组值(IP地址),则它将将主机名替换为保留。
从您的样本中,这将输出:
Reserved IN A 10.10.20.1
Reserved IN A 10.10.20.2
hostname3 IN A 10.10.20.3