我有 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
这是一种方法:
$ 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-工具。