.csv는 특정 이메일 주소만 유지합니까?

.csv는 특정 이메일 주소만 유지합니까?

내 고객 이름이 포함된 대용량 .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.

  1. 설치 cpanm(Perl을 사용한다면 나중에 감사할 것입니다)

    $ sudo apt-get install cpanminus
    

    Debian 기반 시스템을 사용하지 않는 경우 배포판의 패키지 관리자를 사용하여 설치할 수 있습니다.

  2. Text::CSV모듈 설치

    $ sudo cpanm Text::CSV
    
  3. 파일을 구문 분석

    $ 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
    

관련 정보