줄 수가 가장 많은 n개 파일의 파일 이름을 가져옵니다.

줄 수가 가장 많은 n개 파일의 파일 이름을 가져옵니다.

가장 높은 줄 수에서 가장 낮은 줄까지 x개의 파일 이름을 인쇄하려고 합니다. ATM 이거 있어요

wc -l /etc/*.conf |sort -rn | head -6 | tail -5 |

알겠어요

  543 /etc/ltrace.conf
  523 /etc/sensors3.conf
  187 /etc/pnm2ppa.conf
  144 /etc/ca-certificates.conf

지금은 잘 작동하지만 이름만 필요합니다. 행 수를 제거할 수 있는 방법이 있습니까?

답변1

대안:

wc -l /etc/*.conf |sort -rn | head -6 | tail -5 | tr -s ' ' | cut -d' ' -f3

답변2

또 다른 골프 변형.

wc -l /etc/*.conf | sort -rn | sed -n '2,5s/^ *[1-9][0-9]* //p'

이 명령은 sed라인 2-5(출력 라인 순서를 반대로 바꾸었기 때문에 라인 1은 합계임)를 취하고 선행 "{space} {number} {space}" 패턴을 제거합니다.

(다른 모든 솔루션과 동일지금까지, 줄바꿈이 포함된 파일 이름이 주어지면 이 파이프는 강력하지 않습니다. )

답변3

마지막 head+는 맨 위만 인쇄하는 단일 표현식 tail으로 대체될 수 있습니다.awk5 파일 이름:

wc -l /etc/*.conf | sort -rn | awk 'NR>1{ $1=""; print $0 }NR==6{ exit }'

답변4

간단한 Perl 스크립트를 사용하여 작업을 수행하겠습니다.

  1. 원하는 수의 파일과 처리할 파일 목록을 전달합니다.
  2. 행 수를 계산하고 결과를 연관 배열에 저장합니다.
  3. 배열을 값별로 정렬하고 파일 수를 인쇄합니다.

스크립트에 오류 검사가 없습니다(예: 'N'은 정상입니다. 비어 있지 않은 파일 목록이 있습니다. 'N'은 파일 수보다 크지 않습니다. 파일은 디렉터리, 소켓 등이 아닌 일반 파일입니다.) .

#!/usr/bin/perl

# prints the top N given files by line count

my $n = shift;
my %counts = ();
foreach my $file (@ARGV) {
  chomp($counts{$file} = `wc -l < "$file"`);
}

foreach my $file (sort { $counts{$b} <=> $counts{$a} } keys %counts) {
  print "$file\n";
  last unless --$n;
}

이 방향은 쉘 배열의 값을 정렬하거나 파일 이름에 의존하여 특정 문자를 생략하는 것보다 쉽습니다. 파일 이름에 개행 문자가 포함되어 있으면 Perl 스크립트의 출력이 모호해질 수 있습니다. 이러한 파일에 대해 추가 처리를 수행하려면 Perl 스크립트에서 수행합니다.

관련 정보