"N"개 필드보다 많거나 적은 행을 삭제하시겠습니까?

"N"개 필드보다 많거나 적은 행을 삭제하시겠습니까?

저는 sed, Perl, awk, bash를 사용하여 Mac에서 작업하고 있습니다.

TAB13개의 구분된 데이터 필드(열)가 포함 된 대용량(10GB) 텍스트 파일이 있습니다 . 불행히도 그 대사 중 일부는 그것과 아무 관련이 없어서 TABs시도해 보았습니다.중복된 전체 라인 삭제 TABs, 따라서 불평등 영역이 생성됩니다. (이 줄을 완전히 버려도 괜찮습니다)

내가 현재 가지고 있는 것은 필드 수를 다른 파일에 기록합니다.

awk -F'\t' '{print NF}' infile  > fieldCount

head fieldCount
13
13
10
13
13
13
14
13
13
13

13개보다 많거나 적은 올바른 필드가 있는 모든 줄(원본 파일에서)을 제거하는 짧은 스크립트를 작성하고 싶습니다.

  1. 여러 파일로 해야 하기 때문에 속도가 도움이 됩니다
  2. 한 번에 하면 좋을 것 같아요
  3. 현재 fieldCount 파일을 Python으로 이식하고 한 줄씩 로드하려고 합니다.

편집하다:

유효함(13열)

a       b       c       d       e       f       g       h       i       j       k       l       m

유효하지 않음(14열)

a       b       c       d       e       f       g       h       i       j       k       l       m       n

답변1

당신은 거의 그것을 가지고 있습니다 :

awk -F'\t' 'NF==13 {인쇄}'네펠레  >새로운 파일

그리고 키 입력(:)으로 충전되는 시스템 중 하나를 사용하는 경우 다음과 같이 단축할 수 있습니다.

awk -F'\t' 'NF==13'네펠레  >새로운 파일

한 번에 여러 파일을 검사하고 실제로 파일을 변경하려면(새 파일을 만드는 대신) 사용되지 않는 파일 이름(예: scharf)을 식별한 후 다음과 같은 루프를 수행합니다.

f의 경우목록
하다
    awk -F'\t' 'NF==13 {print}' "$f" > scharf && mv -f -- scharf "$f"
완벽한

이것list하나 이상의 파일 이름 및/또는 와일드카드 파일 이름 확장 패턴일 수 있습니다.

blue.data green.data *.dat Orange.data red.data /ultra/violet.dat의 f에 대해

mv이 명령은 입력 파일(예: )을 입력 파일의 13개 필드 행만 포함하는 임시 파일로 덮어씁니다. (이것이 원하는 것인지 확인하고 주의하십시오. 안전을 위해 먼저 데이터를 백업해야 합니다.) 입력 파일이 이미 존재하더라도 덮어쓰도록 지시합니다. 파일 이름이 .blue.datascharf-fmv---

답변2

이는 대용량 파일이므로 성능을 향상시키기 위해 좀 더 정교한 도구를 사용하는 것이 좋습니다. 일반적으로 특수 도구는 범용 도구보다 빠릅니다. 예를 들어, 동일한 문제를 해결하는 것이 더 빠른 cut경우가 많습니다 ( 반면은 이전 도구가 할 수 없는 작업을 최신 도구가 수행할 수 있다는 것입니다).grepsedawk

13개 이상의 탭 문자가 포함된 줄을 삭제하려면 다음과 같이 하세요.

LC_ALL=C grep -Ev '(␉.*){13}'

아니면 (측정 가능한 성능 차이는 기대하지 않습니다)

LC_ALL=C grep -Ev '(␉.*){12}␉'

리터럴 탭 문자는 어디에 있습니까? 로케일 설정은 C필수는 아니지만 일부 GNU grep 버전은 멀티바이트 로케일에 비해 속도를 높일 수 있습니다.

답변3

그리고 perl:

perl -F'\t' -anle 'print if @F == 13' file

내부에서 편집하려면 -i다음 옵션을 추가하세요.

perl -i.bak -F'\t' -anle 'print if @F == 13' file

관련 정보