次のように2つのcsvファイルがあり、file1とfile2を比較したいと思います。レコードがfile2にある場合は、file1から行全体を削除する必要があります。ここで比較されるフィールドは、ソースファイルの場所11のIDです。
ファイル1.CSV
"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","12","","31420","TYPE1"
"A","XY","100","13","","31420","TYPE1"
ファイル2.CSV
"ID"
"11"
"12"
"25"
期待される出力
"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","13","","31420","TYPE1"
答え1
次のユーティリティを使用してくださいcsvkit(私のUbuntuシステムのパッケージpython3-csvkit
):
$ 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"
答え2
ミラー(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
左側のファイルからペアリングされていないレコードをエクスポートする
左側のファイルはinput_01.csvです。
"NAME","CITY","MARKS","ID","C","NAME1","TYPE"
"A","XY","100","12","","31420","TYPE1"
"A","XY","100","13","","31420","TYPE1"
答え3
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