Разделение полей применяется только к результату раскрытия параметра, подстановки команд и арифметического раскрытия, которые не были заключены в двойные кавычки, а не к буквальной строке.
Используя $ 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
не была затронута этим процессом и просто возвращается как есть.
Использование утилит из пакета 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"
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
С Миллером(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"