Сperl
:
perl -lpe '$_.= "\t$ARGV"' File*.txt
(обратите внимание, что это нормально с глобусом вроде File*.txt
, но может быть опасным с другими).
Альтернатива:
wc -l /etc/*.conf |sort -rn | head -6 | tail -5 | tr -s ' ' | cut -d' ' -f3
Последнее head
+ tail
можно заменить одним выражением awk
, которое будет печатать только верхние 5имен файлов:
wc -l /etc/*.conf | sort -rn | awk 'NR>1{ $1=""; print $0 }NR==6{ exit }'
Еще один вариант игры в гольф.
wc -l /etc/*.conf | sort -rn | sed -n '2,5s/^ *[1-9][0-9]* //p'
sed
принимает строки 2 -5 (строку 1, являющуюся общей суммой, так как мы изменили порядок выходных строк )и удалили начальный "{пробел} {число} {пробел}" шаблон.
(Как и любое другое решение до сих пор , этот конвейер не является надежным, если имя файла содержит новую строку.)
Я бы использовал простой Perl-скрипт, который сделает всю работу за вас:
Ошибка -при проверке скрипта (e.g. что «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.