Как сравнить два файла CSV и отобразить уникальные записи?

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

Используя $ myvar , вы получите эффект как glob (split (1,2,3)) , split (1,2,3) с , содержит в IFS return 1 , 2 и 3 , glob (1 2 3 ) вернуть 1 , 2 и 3 .

Литеральная строка 1,2,3 не была затронута этим процессом и просто возвращается как есть.

1
11.04.2019, 02:09
3 ответа

Использование утилит из пакета csvkit(python3-csvkitв моей системе Ubuntu):

$ csvsql --query '
  SELECT * FROM FILE1 WHERE ID NOT IN (SELECT ID FROM FILE2)
' FILE1.CSV FILE2.CSV | csvformat -U1
"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","13","","31420","TYPE1"
3
27.01.2020, 23:30

grep -v -wf file2.csv file1.csvнапечатает каждую строку file1.csv, не содержащую ни одного слова из file1.csv.

Конечно, сейчас отсутствует строка заголовка. Если вам это нужно, сделайте это:

$ head -n1 file1.csv;grep -v -wf file2.csv file1.csv

Если первая строка file2.csvопределяет столбец, в котором слова не должны совпадать, вот awkрешение:

$ awk -v FS="," '
    NR==FNR && NR==1 {column=$1; next;} # save the column name to which one will compare
    NR==FNR {data[$1]++; next;} # save the list of words to match again
    NR!=FNR && FNR==1 {print; for(i=1;i<=NF;i++) {if($i==column) c=i}; next;}  # print header line of file1, find column number to which one will compare
    {if ($c in data == 0) print} # for any following line check if the word is not in our list
' file2.csv file1.csv
0
27.01.2020, 23:30

С Миллером(https://github.com/johnkerl/miller/releases/tag/5.4.0)есть

mlr --csv join --np --ul -j ID -f input_01.csv input_02.csv

Некоторые примечания:

  • --npчтобы не создавать парные записи
  • --ulдля создания непарных записей из левого файла

Вводится левый файл _01.csv

"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","12","","31420","TYPE1"
"A","XY","100","13","","31420","TYPE1"
1
27.01.2020, 23:30

Теги

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