거대한 CSV 파일을 필터링하는 Grep


5

2 백만 줄 이상이 포함 된 CSV 파일을 처리하고 있습니다. 꽤 큰 것입니다.

두 번째 열의 값이 'jpn'또는 'por'과 일치하면 grep (또는 더 나은 방법)을 사용하여 전체 행을 검색해야합니다.

나는 사용하려고 시도 grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv했지만 지금까지 성공하지 못했습니다. 가장 큰 문제는 'por'이 세 번째 열에서 일반적으로 발생하여 백만 개가 넘는 원치 않는 행을 생성한다는 것입니다.

더 숙련 된 사용자가 친절하고 도움이 필요하십니까?

미리 감사드립니다! :디

답변:


11

어떤 Linux OS를 사용하고 있습니까? 사용해보십시오 egrep당신이 그 그렙 버전 (예를 들어 솔라리스를) 오래된되는 시스템에서 정규 표현식을 사용합니다.

어쨌든, 여기 awk 솔루션이 있습니다.

awk -F, '$2 ~ /jpn|por/ {print}' file1.csv > file2.csv

설명 :

  • awk 열 기반 작업
  • -F, 열 구분 기호 / 토큰 화기를 정의하려면이 경우 쉼표를 사용합니다
  • $2 ~ /jpn|por/ 표현식으로 열 # 2 테스트 /jpn|por/
    • $2 열 # 2
    • /jpn|por/ jpn 또는 por와 일치하는 정규식입니다.
  • {print} awk가 일치하는 줄을 찾은 경우 출력해야 할 내용을 지정합니다.
    • print전체 입력 줄을 인쇄하려면 (또는 print $3# 3 열만 인쇄합니다)
  • ... file1.csv stdin 대신 입력 파일에서 읽도록 지정합니다.

OS X 10.10을 사용하고 있습니다. -당신의 팁은 매력처럼 작동했습니다! 대단히 감사합니다! ;)
YLeven

1

grep '; jpn;\|; por;' /path/to/file1.csv > file2.csv

세미콜론 (;)이 구분 기호라고 가정합니다.


0

확실하지 않지만 아마도 작동 할 수 있습니다.

grep '^[^,]*,\(por\|jpn\)\(,\|$\)' file1.csv > file2.csv

","가 구분 기호라고 가정합니다.


0

이것은 나를 위해 작동하는 것 같습니다 :

egrep '^.?,(jpn|por),.*$' file1.csv > file2.csv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.