디렉토리에 있는 각 파일의 줄 수를 계산한 다음 n개 파일 줄의 요약을 만드는 방법

디렉토리에 있는 각 파일의 줄 수를 계산한 다음 n개 파일 줄의 요약을 만드는 방법

디렉터리에 n 줄이 있는 파일 수에 대한 요약을 만들려고 합니다. wc -l * | sort각 파일 이름의 줄 수를 인쇄하는 데 사용하고 있습니다 . 내가 달성하고 싶은 것은 다음을 생성할 디렉토리의 요약입니다.

56 5
60 6
3  7

첫 번째 열은 파일 수를 나타내고 두 번째 열은 행 수를 나타냅니다.

awk 'END{print NR}' directory/*전체 디렉토리의 줄 수를 반환하는 awk 명령을 살펴보았습니다 . 출력 printf형식을 지정 wc -l하는 솔루션을 고려했습니다 . 어떤 도움이라도 대단히 감사하겠습니다! 감사해요

답변1

GNU를 사용하면 awk다음과 같은 작업을 수행할 수 있습니다.

find . -type f -print0 | gawk '
  BEGIN {
    RS = "\0"
    while ((getline < "-") > 0) ARGV[ARGC++] = $0
    if (ARGC == 1) exit
    RS = "\n"
  }
  ENDFILE {count[FNR]++}
  END {
    PROCINFO["sorted_in"] = "@ind_num_asc"
    for (i in count) print count[i], i
  }'

find -print0의 출력에서 ​​NUL로 구분된 파일을 읽어 BEGIN 문에서 처리할 파일 목록을 설정합니다.

또는 다음과 같습니다 perl(빈 파일은 무시됩니다).

find . -type f -print0 | perl -0 -ne '
  BEGIN{@ARGV = <STDIN>; $/ = "\n"}
  if (eof) {$count{$.}++; close ARGV}
  END {print "$count{$_} $_\n" for sort {$a <=> $b} keys %count}'

줄 수(구분 여부에 관계 없이)를 계산하고 wc -l개행 수도 계산합니다. 예를 들어, where를 사용하여 printf foo > file생성된 파일은 wc -l0을 보고하지만 perl/ gawk1을 보고하므로 차이가 있습니다.

POSIXly를 사용하면 wc다음과 같은 작업을 수행할 수 있습니다.

find .//. -type f -exec wc -l {} + | LC_ALL=C awk '
  /\/\// {count[$1]++}
  END {for (i in count) print count[i], i}' | sort -k2n

를 사용하면 .//.파일 경로가 출력에서 ​​시작하는 줄을 알 수 있고 wc( //다른 곳에는 나타날 수 없기 때문에) 줄 개수가 줄의 첫 번째 필드가 되므로 개행이 포함된 파일 경로를 안정적으로 처리할 수 있습니다. 또한 total여러 인수를 전달하는 호출 끝에 인쇄되는 줄을 건너뜁니다.wc//

GNU grep또는 호환 버전을 사용하면 다음을 수행할 수도 있습니다.

LC_ALL=C grep -rch '^' . | sort -n | uniq -c

c일치하는 줄 수를 계산 합니다 ^. 즉, 시작이 있으므로 파일 이름 인쇄를 건너뛰기 위해 모든 파일의 모든 줄이 r반복 .됩니다 . 콘텐츠를 텍스트로 디코딩하는 데 신경 쓰지 마세요( 정규식을 고려하면 GNU는 적어도 해당 디코딩을 최적화할 것입니다).-hLC_ALL=Cgrep

이들 모두는 숨겨진 파일에도 포함됩니다.

이를 건너뛰려면 명령을 find다음과 같이 변경할 수 있습니다.

LC_ALL=C find . -name '.?*' -prune -o -type f -print0

grep -r-r파일 목록을 삭제 하고 다음으로 전달할 수는 있지만 findGNU에 해당하는 것은 없습니다 grep.

LC_ALL=C find . -name '.?*' -prune -o -type f -exec grep -ch {} +

답변2

"wc -l *"이 필요한 방식으로 행을 계산한다고 가정하면(예: 흥미로운 파일 이름이 없으면 uniq -c를 사용하여 계산할 수 있습니다.) head -n -1은 끝에 있는 "total" 줄을 제거합니다.

wc -l *|head -n -1|sort|awk '{print $1}'|uniq -c

관련 정보