여러 개의 큰 파일 각각의 줄 수를 출력하는 스크립트를 작성하는 데 도움이 필요합니다. 시간이 오래 걸리기 때문에 일치하는 모든 파일의 마지막 줄 번호를 표시하는 명령을 wc -l
사용하고 싶습니다.awk
abd*2020-09-21*
ls -l abd*2020-09-21*
22개의 긴(대형) 파일 표시 중wc -l
각 파일에 대한 결과를 찾아야 합니다 .- 현재 내가 사용하고 있는
그러나 이것은 매우 시간이 많이 걸립니다. 개선하는 데 도움이 필요합니다.wc -l abd*2020-09-21.txt > CCNC_UNIX_COUNTS.txt
나는 노력했다
sed -n '$='
이제 matchinv 모든 파일에 대해 루프에서 작동 abd*2020-09-21.txt
하고 결과를 파일로 출력해야 합니다.CCNC_UNIX_COUNTS
답변1
텍스트 파일은 인덱스나 메타데이터가 없는 바이트 스트림일 뿐이며 각 줄 뒤에 개행 문자가 있는 연속된 줄입니다. 파일 전체를 읽는 것 외에는 줄 수를 계산하는 다른 방법이 없습니다. wc -l
이는 개행 바이트를 읽는 일괄 스캔 외에는 다른 작업을 수행할 필요가 없기 때문에 효율적으로 수행할 수 있습니다. 반면에 awk
살펴볼 다른 도구도 많이 있습니다.콘텐츠필드 분할 수행과 같은 라인에서는 실행을 위해 제공한 코드를 해석하고 실행해야 합니다. wc -l
이보다 더 빠른 스크립트 언어는 없습니다 .
반면에 메타데이터 누락이 일반적으로 문제인 경우 다른 파일 형식(예: SQLite 데이터베이스)을 사용하는 것이 옵션일 수 있습니다. 물론 이렇게 하면 일반적인 텍스트 처리 도구를 사용하여 데이터를 작업할 수 없지만 임의 액세스가 더 쉬워질 수 있습니다. 또는 모든 행을 유지하도록 데이터 경로를 수정할 수 있는 경우일정한 길이, 임의 액세스 및 행 계산은 간단합니다(그러나 중간에 행을 삽입하거나 삭제하지는 않음).
답변2
개수가 정확할 필요가 없으면 파일 끝에서 샘플링하여 평균을 구하고 매우 빠른 통계로 얻은 파일의 바이트 길이를 기준으로 줄 수를 계산하여 길이를 추정할 수 있습니다. .
예를 들어, /tmp에 100MB 파일이 있습니다. 사용:
time wc -l /tmp/100-mb.txt
생산하다:
1777700 /tmp/100-mb.txt
real 0m0.075s
추정을 위해 Perl 코드를 사용하십시오.
time ./esmele /tmp/100-mb.txt
생산하다:
1763385
real 0m0.012s
정확도는 99% 이상이며 속도는 6배 향상됩니다. Perl 변환이 생략되므로 C 또는 유사한 코드가 더 빠를 수 있습니다.
시스템에서 실행:
OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution : Debian 8.11 (jessie)
perl 5.20.2
행운을 빕니다... 건배, drl
답변3
하드웨어에 따라 다음을 시도해 볼 수 있습니다.
expr-fi/fastlwc: SIMD 강화 단어 카운터 - GitHub
멀티스레드 버전도 있습니다.
대용량 파일로 테스트하지는 않았지만 작동하고예빠르게.
SIMD를 통한 단어 계산 알고리즘은 readme 파일에 설명되어 있습니다. 기본 아이디어는 다음과 같습니다.
Just a sample (multiple spaces).
1111010111111011111111100011111111 =[1]
0111101011111101111111110001111111 SHIFT [1] =[2]
1000010100000010000000001110000000 NOT [2] =[3]
1000010100000010000000000010000000 [1] AND [3]
fastwc
단어와 줄은 계산되지만 멀티바이트 문자는 계산되지 않습니다 .