Как сравнить два столбца из двух CSV-файлов с awk?

#awk

#awk

Вопрос:

У меня есть два файла CSV, которые мне нужно сравнить с одним столбцом.

Мой member.csv файл выглядит как:

 ID|lastName|firstName
01|Lastname01|Firstname01
02|Lastname02|Firstname02
  

Второй файл check-ID.csv выглядит как:

 Lastname01|Name01|pubID01|Hash01
Lastname02|Name02|pubID02|Hash02a
Lastname03|Name03|pubID03|Hash03
Lastname02|Name02|pubID02|Hash02b
Lastname01|Name01|pubID01|Hash01b
  

—> Lastname03 не в моем member.csv !

Я хочу проверить, равно ли значение первого столбца check-ID.csv значению второго столбца в member.csv .

Моя попытка с script.awk

 NR==FNR{a[$1]=$1; b[$1]=$0; next} 
$2==a[$1]{ delete b[$1]}

END{for (i in b ) print b[i]}
  

выполнение с

awk -f script.awk check-ID.csv member.csv

Проблема в том, что результат не фильтруется.

Мне нравится получать отфильтрованный и отсортированный вывод, чтобы только участники были перечислены следующим образом:

 Lastname01|Name01|pubID01|Hash01
Lastname01|Name01|pubID01|Hash01b
Lastname02|Name02|pubID02|Hash02a
Lastname02|Name02|pubID02|Hash02b
  

Любая помощь приветствуется!

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее. Я думаю, вы были близки, единственное, что вы могли бы изменить последовательность чтения Input_files. Где я сначала читаю members Input_file, а затем check-ID.csv потому что позже Input_file содержит все детали, которые необходимо распечатать, и нам нужно проверить только 2-е поле из members Input_file.

 awk '
BEGIN{
  FS="|"
}
FNR==NR{
  a[$2]
  next
}
($1 in a)
' members.csv check-ID.csv | 
sort -t'|' -k1
  

Объяснение: Добавляю подробное объяснение выше.

 awk '                             ##Starting awk program from here.
BEGIN{                            ##Starting BEGIN section of this program from here.
  FS="|"                          ##Setting field separator as | here.
}
FNR==NR{                          ##Checking condition if FNR==NR which will be TRUE when first Input_file named members.csv is being read.
  a[$2]                           ##Creating array a with index 2nd field here.
  next                            ##next will skip all further statements from here.
}
($1 in a)                         ##Checking condition if 1st field is preent in a then print that line.
' members.csv check-ID.csv |      ##Mentioning Input_file names here and sending its output to sort command.
sort -t'|' -k1                    ##Sorting output(which we got from awk command above) by setting separator as | and by first field.