他のCSVファイルに対応/一致するタイムスタンプを持たないCSVファイルのすべての行を削除します。

他のCSVファイルに対応/一致するタイムスタンプを持たないCSVファイルのすべての行を削除します。

以下のように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-ツール

関連情報