如何用三剑客awk或者其他shell脚本方法将两个文件,以一个文件的参数及其值为标准,去重以后输出?
5 个回答
参考下面代码,大概思路是将参数文件先读出来
[root@controller ~]# sed 's/[&0-9]*//' d.txt
oxstand.doocom.cn.113.106.94.158
.220.150.28
web202.ss-dns.com.113.106.88.135
.213.48.23
web35.ss-dns.com.113.106.88.135
.234.54.215
.159.7.3
.155.122.214
.95.224.151
.148.254.118
c.17986.net.67.21.93.242
[root@controller ~]# cat parameter.txt
s/[&0-9]*//
[root@controller ~]# sed $(cat parameter.txt) d.txt
oxstand.doocom.cn.113.106.94.158
.220.150.28
web202.ss-dns.com.113.106.88.135
.213.48.23
web35.ss-dns.com.113.106.88.135
.234.54.215
.159.7.3
.155.122.214
.95.224.151
.148.254.118
c.17986.net.67.21.93.242
awk -F '[ =]' 'NR==FNR{a[$1]=$0;next}{if(!a[$1]){print}}1' file1 file2 > output
上述命令实现:有两个文件file1和file2,它们都包含一些参数及其对应的值,每行一个参数和值,以空格或等号分隔。想要将file1和file2合并后去重,以file1为标准,即如果file2中有与file1中相同参数名的行,则将file1中的行保留,file2中的行忽略。
解释:
-
-F '[ =]'
:指定分隔符为空格或等号。 -
NR==FNR{a[$1]=$0;next}
:对于第一个文件file1,将每行的参数名作为数组a的键,将整行作为数组a的值存储起来。 -
{if(!a[$1]){print}}1
:对于第二个文件file2,如果当前行的参数名在数组a中不存在,则输出该行。 -
file1 file2
:指定要处理的文件。 -
> output
:将输出重定向到文件output中。
执行该命令后,输出文件output中包含了两个文件中的所有行,以file1为标准去重。