다른 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-도구.

관련 정보