首页 > 解决方案 > 排除列值存在于另一个文件中的行

问题描述

我有 2 个.csv列出 IP 和名称的文件。

我的目标是创建一个输出文件,列出 中的所有行file_a.csv,不包括ip已经存在的行file_b.csv,无论该列的值是什么name

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

和file_b.csv:

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

此示例的输出文件为:

ip,name,kind
10.0.0.2,AA,ID
10.0.0.4,BB,ID
10.0.0.6,CC,ID

到目前为止,我猜测 awk 的循环可能会起作用,但我不确定如何进行比较:

awk -F ',' 'NR==FNR{c[$1]++;next}; <comparison missing>' file_a.csv file_b.csv > new_file.csv

欢迎任何其他实现目标的命令。

标签: awkgrep

解决方案


请您尝试以下操作。

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

推荐阅读