我有2个.csv
文件列出了IP和名称。
我的目标是创建一个输出文件,列出file_a.csv
中的所有行,不包括ip
中已经存在的file_b.csv
的行,而不管{{ 1}}就在那里。
file_a.csv:
name
和file_b.csv:
ip,name,kind
10.0.0.1,AA,ID
10.0.0.2,AA,ID
10.0.0.3,BB,ID
10.0.0.4,BB,ID
10.0.0.5,CC,ID
10.0.0.6,CC,ID
此示例的输出文件为:
ip,name,kind
10.0.0.1,AA,ID
10.0.0.3,XX,ID
10.0.0.5,YY,ID
10.0.0.7,ZZ,ID
10.0.0.9,ZZ,ID
直到现在,我猜测使用awk的循环可能有效,但是我不确定如何执行比较:
ip,name,kind
10.0.0.2,AA,ID
10.0.0.4,BB,ID
10.0.0.6,CC,ID
欢迎使用其他任何达到目标的命令。
答案 0 :(得分:1)
请您尝试以下。
awk 'BEGIN{FS=","} FNR==NR{a[$1]=$0;next} ($1 in a){delete a[$1]} END{for(i in a){if(a[i]){print a[i]}}}' file_a.csv file_b.csv
为了处理文件头,请尝试以下操作。
awk '
BEGIN{
FS=","
}
FNR==1 && ++count==1{
print
next
}
FNR==NR{
a[$1]=$0
next
}
($1 in a){
delete a[$1]
}
END{
for(i in a){
if(a[i]){
print a[i]
}
}
}' Input_file_a.csv Input_file_b.csv
输出如下。
ip,name,kind
10.0.0.2,AA,ID
10.0.0.4,BB,ID
10.0.0.6,CC,ID
答案 1 :(得分:1)
直截了当的方式:
$ awk -F, 'NR==FNR {a[$1]=$0;next}!($1 in a)||FNR==1' b a
ip,name,kind
10.0.0.2,AA,ID
10.0.0.4,BB,ID
10.0.0.6,CC,ID
答案 2 :(得分:0)
另一个awk
$ awk -F"," ' { if(NR==1) print; a[$1]=ARGIND; b[$1]=$0} END { for( i in a) { if(a[i]==1) print b[i] } } ' filea.csv fileb.csv
ip,name,kind
10.0.0.2,AA,ID
10.0.0.4,BB,ID
10.0.0.6,CC,ID
$