2つのCSVファイルを比較し、独自の履歴を表示するには?

2つのCSVファイルを比較し、独自の履歴を表示するには?

次のように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.csvfile1.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

関連情報