различие между двумя файлами различных номеров строк

Вчера я задал этот вопрос и получил потрясающие ответы, это - действительно радость для задавания вопросов на этом сайте.

Сегодня я получил немного отличающийся вопрос

скажите, что я имею 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.

1
задан 13 April 2017 в 15:24

1 ответ

Вот один путь:

$ 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) быть распечатан.
3
ответ дан 7 December 2019 в 12:45

Другие вопросы по тегам:

Похожие вопросы: