根据与另一个文件中不同字段的匹​​配替换一个文件中的字段

根据与另一个文件中不同字段的匹​​配替换一个文件中的字段

感谢对此任务的任何帮助:

文件 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

(根据我的答案修改这里...

你可以比较一下NRFNR区分处理第一个文件或后续文件。这是因为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,并将其所有数据放入arrFileA中名为 的数组中,如果第四个字段$4=数组值(IP地址),则它将将主机名替换为保留。

从您的样本中,这将输出:

Reserved IN A 10.10.20.1 
Reserved IN A 10.10.20.2 
hostname3 IN A 10.10.20.3

相关内容