디렉토리에 있는 각 작성자의 문서 수를 출력하는 방법

디렉토리에 있는 각 작성자의 문서 수를 출력하는 방법

텍스트 데이터 세트에서 작성자별로 문서 세트를 계산하려고 합니다. 저자 이름과 제목이 붙은 목차가 있습니다. 각 작성자의 디렉토리에 있는 문서 수를 출력하고 싶습니다. 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파일 이름 와일드카드 확장 결과는 항상 사전순으로 정렬되므로 호출하기 전에 루프의 출력을 정렬할 필요가 없습니다.

이는 작성자 이름에 개행 문자가 포함되어 있지 않다고 가정합니다. 그러나 세 개의 밑줄 뒤에는 줄 바꿈이 허용됩니다.

관련 정보