Исключая строки, где значение столбца существует в другом файле - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть 2 .csv файлы с IP-адресами и именами.

Моя цель - создать выходной файл, в котором перечислены все строки из file_a.csv, за исключением тех, где ip уже существуетв file_b.csv, независимо от того, какое значение имеет столбец name.

file_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

Любые другие команды, которые достигают цели, приветствуются.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Прямой путь:

$ 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
0 голосов
/ 13 февраля 2019

Еще один 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
$
0 голосов
/ 13 февраля 2019

Не могли бы вы попробовать следующее.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...