Вчера я задал этот вопрос и получил потрясающие ответы, это - действительно радость для задавания вопросов на этом сайте.
Сегодня я получил немного отличающийся вопрос
скажите, что я имею csv1
1,2,3,4
5,6,7,8 --
9,10,11,12
13,14,15 --
и csv2
имеет
1,2,3,4,5 --
20,21,22,23,24
24,25,26,27,28
9,10,11,12,30 --
45,46,47,48,60
Как я могу распечатать только те строки, 1-е 4 поля которых только присутствуют в одном из этих двух файлов? Другими словами, отбросьте все строки из каждого файла, 1-е четыре поля которого также присутствуют в строке в другом файле.
1,2,3,4
9,10,11,12
20,21,22,23,24
24,25,26,27,28
45,46,47,48,60
Отметьте это --
не существует в фактических файлах, я добавил их, чтобы помочь Вам заметить различие.
До сих пор я загружаю все в массивах numpy и сравниваю каждый элемент,
if a[i] == b[i] and ...
Но я хочу знать, существует ли лучший способ сделать это с помощью инструментов Linux.
Править
Каждая строка в csv2 имеет соответствующую строку в csv1 и в том же файле нет никаких дублирующихся строк. в основном я пытаюсь удалить csv2 из csv1 и произвести остальную часть csv1.
Вот один путь:
$ awk -F, 'NR==FNR{a[$1$2$3$4]++; next}!a[$1$2$3$4]' csv2 csv1
110,12,31,345
1,12,14,55
12,53,22,10
1,12,32,44
-F,
: установите разделителя полей на. Теперь, первое разделенное от запятой поле каждой строки будет $1
, второе $2
и так далее. NR==FNR
: это две awk специальные переменные. НОМЕР является текущей входной строкой, и FNR является номером строки текущего файла. Эти два будут равны только, в то время как 1-й файл читается. NR==FNR{a[$1$2$3$4]++; next}
: при чтении 1-го файла сохраните 1-е 4 поля как ключ в массиве a
и установленный их значение к 1. Это в основном сохраняет все 1-е 4 поля csv1
. next
гарантирует, чтобы мы сразу пропустили к следующей строке и не обрабатывали остальную часть сценария. !a[$1$2$3$4]
: действие по умолчанию awk должно распечатать текущую строку. Так, при использовании чего-то, что оценивает к истинному, awk понимает, что должен распечатать эту строку. !a[ $1$2$3$4]
верно когда a[$1$2$3$4]
не определяют, который произойдет для строк в csv1
чьи 1-е 4 поля не присутствовали ни в каких строках csv2
. Поэтому эта директива вызовет все строки, 1-е 4 поля которых никогда не замечались (так их значение в a
массив не должен 1) быть распечатан.