이것질문에 답변됨특정 파일 이름을 검색하고 정렬하는 방법을 설명했지만 전체 디렉토리에 대해 이를 수행하는 방법은 무엇입니까? 1백만 개의 텍스트 파일이 있고 가장 일반적인 10개의 단어를 검색해야 합니다.
데이터베이스 = /data/000/0000000/s##_date/*.txt - /data/999/0999999/s##_data/*txt
내가 시도한 모든 결과는 파일 이름, 경로 또는 디렉터리 정렬 오류로 이어졌습니다.
grep을 사용하여 약간의 진전을 이루었지만 파일 이름의 일부가 결과에 표시되는 것 같습니다.
grep -r . * | tr -c '[:alnum:]' '[\n*]' | sort | uniq -c | sort -nr | head -10
output:
1145
253 txt
190 s01
132 is
126 of
116 the
108 and
104 test
92 with
84 in
"txt" 및 "s01"은 텍스트 파일 내의 텍스트가 아니라 파일 이름에서 나옵니다. "the"와 같은 일반적인 단어를 제외하는 방법이 있다는 것을 알고 있지만 파일 이름을 정렬하고 계산하고 싶지는 않습니다.
답변1
grep
여러 파일을 검색하는 경우 패턴과 일치하는 각 파일의 파일 이름이 일치 항목이 포함된 줄과 함께 표시됩니다.
실제로 모든 텍스트 파일을 함께 모아서 다음을 사용하여 하나의 큰 문서로 처리할 수 있습니다 ( 명령줄에서 한 번에 모든 파일을 처리 grep
할 수 없는 고무적이지만 느린 솔루션입니다 ).cat
cat
find /data -type f -name '*.txt' -exec cat {} + |
tr -cs '[:alnum:]' '\n' | sort | uniq -c | sort -nr | head
여러 개의 연속된 개행 문자가 하나로 압축되고 영숫자가 아닌 모든 항목이 개행 문자로 변경되도록 추가했습니다( -s
나 에게는 거의 이해되지 않습니다). 이 명령은 기본적으로 10줄의 출력을 생성하므로 (or)가 필요하지 않습니다.tr
[\n*]
head
-10
-n 10
이 명령은 find
파일 이름이 이 패턴과 일치하는 -type f
모든 일반 파일()을 찾습니다. 한 번에 가능한 한 많은 파일을 호출하여 연결합니다(이것이 완료되었습니다). 파일 수가 많은 경우 여러 번 호출될 수 있지만 +에서 출력 스트림을 읽기만 하므로 파이프라인의 나머지 부분에는 영향을 미치지 않습니다./data
*.txt
cat
-exec cat {} +
cat
find
cat
빈 행을 계산하지 않으려면 파이프라인의 sed '/^ *$/d'
첫 번째 행 앞이나 뒤에 삽입 하는 것이 좋습니다.sort