텍스트 데이터 세트에서 작성자별로 문서 세트를 계산하려고 합니다. 저자 이름과 제목이 붙은 목차가 있습니다. 각 작성자의 디렉토리에 있는 문서 수를 출력하고 싶습니다. ls 명령에 대한 파일의 몇 가지 예는 다음에서 볼 수 있습니다.
'Winston Churchill___Richard Carvel, Complete.txt'
'Winston Churchill___The Celebrity, Complete.txt'
'Winston Churchill___The Crisis, Complete.txt'
'Winston Churchill___The Crossing.txt'
'Winston Churchill___The Dwelling Place of Light, Complete.txt'
'Winston Churchill___The Inside of the Cup, Complete.txt'
'Zane Grey___Betty Zane.txt'
'Zane Grey___Desert Gold.txt'
'Zane Grey___Riders of the Purple Sage.txt'
'Zane Grey___Tales of Fishes.txt'
'Zane Grey___Tales of lonely trails.txt'
'Zane Grey___The Border Legion.txt'
'Zane Grey___The Call of the Canyon.txt'
'Zane Grey___The Day of the Beast.txt'
'Zane Grey___The Desert of Wheat.txt'
문서가 3000개가 넘기 때문에 수동으로 셀 수 없습니다.
답변1
다음은 트릭을 수행해야 합니다( .txt
접미사, 하위 폴더 없음 및 작성자 구분 기호로 "___" 가정).
find -maxdepth 1 -mindepth 1 -name '*.txt' -printf '%f\n' | awk -F'___' '{print $1}' | sort | uniq -c
더 쉽게 읽을 수 있도록 별도의 줄에:
find ./ -maxdepth 1 -mindepth 1 -name '*.txt' -printf '%f\n' |
awk -F'___' '{print $1}' |
sort |
uniq -c
할 수 있는 작업:
find
모든 파일을 나열하는 데 사용됩니다 .a)
.txt
- 접미사 (-name '*.txt'
)b) 하위 디렉터리가 아닌 현재 디렉터리(
-maxdepth 1
)c) 디렉터리 자체를 나열하지 않음(
-mindepth 1
)d) 디렉토리 이름 앞과 줄 바꿈 없이 파일 이름을 인쇄합니다.
-printf '%f\n'
사용
awk
a) define three underscores as field separator `-F'___'` b) print first field (author) only `'{print $1}'`
sort
출력은 확실합니다uniq
고유한 항목만 나열하고-c
개수를 계산하는 데 사용됩니다 .
물론, 파일 이름에 줄바꿈이나 이와 유사한 문자가 있으면 0으로 끝나는 목록을 사용해야 합니다. 따라서 각별히 주의하여 취급하려면 다음을 수행하십시오.
find ./ -maxdepth 1 -mindepth 1 -name '*.txt' -printf '%f\000' | awk 'BEGIN {RS="\x00" ; FS="___" ; ORS=\x00"} {print $1}' | sort -z | uniq -zc | tr '\000' '\n'
그러나 나는 이것이 너무 지나친 것이라고 생각한다.
답변2
$ for name in *___*.txt; do printf '%s\n' "${name%%__*}"; done | uniq -c
6 Winston Churchill
9 Zane Grey
이는 저자 이름을 인쇄하고 uniq -c
각 이름의 발생 횟수를 계산합니다. ___
파일 이름에서 처음 나타나는 모든 항목(밑줄 3개)을 제거하여 각 파일 이름에서 이 이름을 얻습니다.
uniq -c
파일 이름 와일드카드 확장 결과는 항상 사전순으로 정렬되므로 호출하기 전에 루프의 출력을 정렬할 필요가 없습니다.
이는 작성자 이름에 개행 문자가 포함되어 있지 않다고 가정합니다. 그러나 세 개의 밑줄 뒤에는 줄 바꿈이 허용됩니다.