내 목적은 두 개의 서로 다른 csv 파일의 특정 열을 비교하고 첫 번째 파일에 없는 두 번째 파일에서 데이터를 가져오는 것입니다. 예를 들어.
첫 번째 파일
"siddhartha",1
"mukherjee",2
두 번째 파일
"siddhartha",1
"mukherjee",2
"unique",3
예상 출력
"unique",3
다음 명령은 첫 번째 열의 텍스트 크기가 제한되어 있을 때 잘 작동하므로 위의 예에서도 잘 작동합니다.
awk -F',' 'FNR==NR{a[$1];next};!($1 in a);' file1.csv file2.csv > file3.csv
그러나 첫 번째 열의 텍스트 크기가 상당히 커서(예: 10000자) 작동하지 않습니다. 특정 지점에서 텍스트를 자릅니다.
해결책이 있나요?
답변1
위의 간단한 예를 기반으로 하면 이것이 작동합니다. 첫 번째 열의 데이터가 다른 열로 끝나거나 데이터에 공백이 있으면 실패합니다.
bash와 GNU grep을 사용하십시오.
grep -v -Ff <(cut -d',' -f 1 file1.csv) file2.csv > file3.csv
설명하다
-v
역 매칭-Ff
파일을 스키마 소스로 사용<(cut -d',' -f 1 file1.csv)
데이터의 첫 번째 열을 가져와서 "파일"로 사용합니다.
답변2
awk를 사용하지 않는 솔루션은 다음과 같습니다.밀러:
$ mlr --nidx join -u -j 1 --np --ur -f file1.csv file2.csv
"unique",3
설명하다:
--nidx
열은 위치에 따라 인덱싱되기 때문에(즉, 헤더 행이 없음)-u
연결 옵션에는 정렬 입력이 필요하지 않습니다.-j 1
왼쪽 및 오른쪽 파일의 열 1을 결합합니다.--np --ur
짝을 이룬 줄을 내보내지 말고, 짝이 없는 줄을 오른쪽 파일에 내보냅니다.