두 개의 .csv 파일을 비교하고 세 번째 파일에 쓰기

두 개의 .csv 파일을 비교하고 세 번째 파일에 쓰기

내 Mac에는 두 개의 파일이 있습니다.

file1.csv(약 4000줄)

1234,yxds
4352,fsfk
8765,fdgj
7874,hffe
9038,fjro
8297,fhjs

그리고 file2.csv(약 50줄)

1234,"number","date","OS"
4352,"number","date","OS"
8765,"number","date","OS"
8297,"number","date","OS"

파일 3은 다음과 같아야 합니다.

1234,yxds
4352,fsfk
8765,fdgj
8297,fhjs

file2.csv그래서 나는 열 2에 존재하는 항목만 원합니다.file1.csv

file1.csv본질적으로 나는 다른 스크립트와 비교하는 스크립트를 작성하고 싶습니다.file3.csv

나는 지금까지 성공 join하지 못했습니다 awk. 지금까지 시도한 내용은 다음과 같습니다.

join -t, -12 -o 1.1,2.1,2.2 file1.csv file2.csv > file 3.csv

그리고

awk 'NR==FNR{a[$1]=$2;next}{if ($1 in a && a[$1] != $2)print;}' FS="|" file1.csv file2.csv > file3.csv

답변1

join정렬 에 사용되는 파일:

join -o 1.1,1.2 <(sort file1.csv) <(sort file2.csv) > file3.csv
  • -o 1.1,1.2출력을 file1.field1나타내고file1.field2

산출:

1234 yxds
4352 fsfk
8297 fhjs
8765 fdgj

답변2

필수 콘텐츠로 f1 및 f2 파일 2개를 생성하고 다음 명령을 실행합니다( 8297출력에 포함하려는 경우 작동함).

sort -k1 f1 > ff1
sort -k1 f2 > ff2
join ff1 ff2 | cut -d ' ' -f1 > t1.txt
join ff1 ff2 | cut -d ' ' -f2 > t2.txt
paste t1.txt t2.txt > finaloutput.out
rm f1 f2 ff1 ff2

Finaloutput.out에는 원하는 출력이 포함됩니다.

답변3

밀러 사용(https://github.com/johnkerl/miller)

mlr --nidx join -j 1 --lp 2 -f input_01.csv then unsparsify then cut -f 1,22 input_02.csv

당신은 할 것

1234 yxds
4352 fsfk
8765 fdgj
8297 fhjs

답변4

검색어(file2.csv의 첫 번째 열)를 검색 패턴 파일로 grep에 전송합니다.

$ awk '{print $1}' file2.csv | grep -f - file1.csv 

1234 yxds
4352 fsfk
8765 fdgj
8297 fhjs

관련 정보