以下のように2つのCSVファイルがあります。
file1.csv
col1,col2,col3,col4,date,time,col7
1,2,3,4,2019-07-20,12:40:00,0
1,2,3,4,2019-07-20,12:43:00,0
1,2,3,4,2019-07-20,12:44:00,0
1,2,3,4,2019-07-20,12:45:00,0
1,2,3,4,2019-07-20,12:46:00,0
1,2,3,4,2019-07-20,12:47:00,0
file2.csv
date,time,col3
2019-07-20,12:40:00,1
2019-07-20,12:41:00,2
2019-07-20,12:42:00,3
2019-07-20,12:43:00,4
2019-07-20,12:44:00,5
2019-07-20,12:45:00,6
2019-07-20,12:46:00,7
2019-07-20,12:47:00,8
に示すように、file2.csv
それぞれタイムスタンプと行2と3の場合は、2019-07-20,12:41:00
同じ2019-07-20,12:42:00
タイムスタンプを持つ行はありませんfile1.csv
。タイムスタンプが一致する行だけを残すように、出力から特定のfile2.csv
行を削除したいと思います。file1.csv
コマンドラインで単純なコマンドを使用してこれを実行できますか?正規表現のマッチングが必要かもしれないという予感がありますが、これを行う最も効率的な方法はよくわかりません。
ありがとうございます!
答え1
1つの方法は次のとおりです。
$ awk -F, 'NR==FNR {a[$5 FS $6]; next} ($1 FS $2) in a' file1 file2
date,time,col3
2019-07-20,12:40:00,1
2019-07-20,12:43:00,4
2019-07-20,12:44:00,5
2019-07-20,12:45:00,6
2019-07-20,12:46:00,7
2019-07-20,12:47:00,8
答え2
csv-sqlite -i file1.csv -i file2.csv \
'select * from input2 where date || time in (select date || time from input1) |
csv-header --remove-types'
csv-sqliteのcsv-nix-ツール。