디렉터리에 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 -l
0을 보고하지만 perl
/ gawk
1을 보고하므로 차이가 있습니다.
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는 적어도 해당 디코딩을 최적화할 것입니다).-h
LC_ALL=C
grep
이들 모두는 숨겨진 파일에도 포함됩니다.
이를 건너뛰려면 명령을 find
다음과 같이 변경할 수 있습니다.
LC_ALL=C find . -name '.?*' -prune -o -type f -print0
grep -r
-r
파일 목록을 삭제 하고 다음으로 전달할 수는 있지만 find
GNU에 해당하는 것은 없습니다 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