排除其他文件中存在列值的行

时间:2019-02-13 14:24:55

标签: awk grep

我有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

欢迎使用其他任何达到目标的命令。

3 个答案:

答案 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
$