내 고객 이름이 포함된 대용량 .csv 파일이 있습니다. 이메일
이 목록에 포함된 또 다른 대규모 이메일 목록이 있는데 해당 이메일만 보관하고 싶습니다. X.txt에 없는 .csv 파일에서 모든 연락처를 삭제하는 방법은 무엇입니까?
답변1
X.txt의 이메일이 한 줄에 하나씩 있다고 가정하면 배열을 만들고 존재하는지 확인한 다음 일치하는 줄을 인쇄할 수 있습니다.
$ awk -F: 'FNR==NR { a[$2] = $0; next } ($1 in a) { print a[$1] }' customers.csv X.txt
Foo Bar:[email protected]
Baz Qux:[email protected]
FNR==NR
첫 번째 파일에 있는 경우에만 참입니다. 이 기능을 테스트하는 데 사용한 파일은 다음과 같습니다.
$ cat customers.csv
Foo Bar:[email protected]
Baz Qux:[email protected]
Wibble Wobble:[email protected]
$ cat X.txt
[email protected]
[email protected]
답변2
이메일이 .csv 파일의 특정 필드에 있을 필요는 없지만 파일에서 대상 이메일 중 하나가 포함된 해당 줄만 인쇄해야 하는 경우 다음을 사용할 수 있습니다 grep
.
grep -wFf emails.txt file.csv > newfile.csv
정말로 특정 지역에 있어야 한다면 @ChrisDown을 사용하세요.해결책. 하지만 csv 파일은 매우 복잡할 수 있다는 점에 유의하세요. 예를 들어 다음은 유효한 csv 행입니다.
field1,"field 2, which can contain commas, is here", field3
이와 같이 더 복잡한 파일의 경우 csv 파서를 사용하여 올바르게 처리해야 합니다. 예를 들어 Perl에서는 다음을 사용할 수 있습니다 Text::CSV
.
설치
cpanm
(Perl을 사용한다면 나중에 감사할 것입니다)$ sudo apt-get install cpanminus
Debian 기반 시스템을 사용하지 않는 경우 배포판의 패키지 관리자를 사용하여 설치할 수 있습니다.
Text::CSV
모듈 설치$ sudo cpanm Text::CSV
파일을 구문 분석
$ perl -MText::CSV -le ' BEGIN{ open($f,"emails.txt"); while(<$f>){chomp; $k{$_}++;} } $csv=Text::CSV->new({binary=>1}); while ($row = $csv->getline(STDIN)){ print join",", @$row if defined($k{$row->[2]}) }' < file.csv