#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.