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

Awk 排除列值存在于其他文件中的行,awk,grep,Awk,Grep,我有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 和文件_b.csv: ip,name,kind 10.0.0.1,AA,ID 10.0.0.3

我有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
和文件_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
awk-F','NR==FNR{c[$1]++;next};'文件\u a.csv文件\u b.csv>新建文件.csv

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

请尝试以下命令

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
为了处理文件中的标题,请尝试以下操作

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

你能试试下面的吗

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
为了处理文件中的标题,请尝试以下操作

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
直截了当的方式:

$ 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
直截了当的方式:

$ 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
另一个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
$
另一个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
$

@泽尔达尔夫,请也尝试一下这个解决方案。@泽尔达尔夫,请也尝试一下这个解决方案。除了接受答案外,你还可以投票表示感谢。当有其他好的答案时,你可以选择最好的,不一定是第一个。此外,你还可以/应该对其他好的答案表示感谢,因为他们花时间帮助你,给了你好的解决方案看到你是SO的5岁成员,但还没有这样做,也许值得一提。除了接受答案,你还可以投票表示感谢。当有其他好的答案时,你可以选择最好的,不一定是第一个。此外,你还可以/应该对其他好的答案表示感谢,因为他们花时间帮助你,给了你好的解决方案鉴于你已经是SO的5岁会员,但还没有做这些,所以也许值得一提。