저는 sed, Perl, awk, bash를 사용하여 Mac에서 작업하고 있습니다.
TAB
13개의 구분된 데이터 필드(열)가 포함 된 대용량(10GB) 텍스트 파일이 있습니다 . 불행히도 그 대사 중 일부는 그것과 아무 관련이 없어서 TABs
시도해 보았습니다.중복된 전체 라인 삭제 TABs
, 따라서 불평등 영역이 생성됩니다. (이 줄을 완전히 버려도 괜찮습니다)
내가 현재 가지고 있는 것은 필드 수를 다른 파일에 기록합니다.
awk -F'\t' '{print NF}' infile > fieldCount
head fieldCount
13
13
10
13
13
13
14
13
13
13
13개보다 많거나 적은 올바른 필드가 있는 모든 줄(원본 파일에서)을 제거하는 짧은 스크립트를 작성하고 싶습니다.
- 여러 파일로 해야 하기 때문에 속도가 도움이 됩니다
- 한 번에 하면 좋을 것 같아요
- 현재 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.data
scharf
-f
mv
--
-
답변2
이는 대용량 파일이므로 성능을 향상시키기 위해 좀 더 정교한 도구를 사용하는 것이 좋습니다. 일반적으로 특수 도구는 범용 도구보다 빠릅니다. 예를 들어, 동일한 문제를 해결하는 것이 더 빠른 cut
경우가 많습니다 ( 반면은 이전 도구가 할 수 없는 작업을 최신 도구가 수행할 수 있다는 것입니다).grep
sed
awk
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