가장 높은 줄 수에서 가장 낮은 줄까지 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
으로 대체될 수 있습니다.awk
5 파일 이름:
wc -l /etc/*.conf | sort -rn | awk 'NR>1{ $1=""; print $0 }NR==6{ exit }'
答え4
간단한 Perl 스크립트를 사용하여 작업을 수행하겠습니다.
- 원하는 수의 파일과 처리할 파일 목록을 전달합니다.
- 행 수를 계산하고 결과를 연관 배열에 저장합니다.
- 배열을 값별로 정렬하고 파일 수를 인쇄합니다.
스크립트에 오류 검사가 없습니다(예: '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 스크립트에서 수행합니다.