删除 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:002019-07-20,12:42:00在 中不存在具有相同时间戳的对应行file1.csv。我想file2.csv在输出时删除那些特定的行,以便仅file1.csv保留具有匹配时间戳的行。

是否可以在命令行中使用简单的命令来执行此操作?我有预感它可能涉及正则表达式匹配,但我不确定执行此操作的最有效方法。

谢谢你!

答案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-工具

相关内容