Получить имена файлов из n файлов с наибольшим количеством строк.

Сperl:

perl -lpe '$_.= "\t$ARGV"' File*.txt

(обратите внимание, что это нормально с глобусом вроде File*.txt, но может быть опасным с другими).

0
03.12.2019, 00:16
4 ответа

Альтернатива:

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

Последнее head+ tailможно заменить одним выражением awk, которое будет печатать только верхние 5имен файлов:

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

Еще один вариант игры в гольф.

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

sedпринимает строки 2 -5 (строку 1, являющуюся общей суммой, так как мы изменили порядок выходных строк )и удалили начальный "{пробел} {число} {пробел}" шаблон.

(Как и любое другое решение до сих пор , этот конвейер не является надежным, если имя файла содержит новую строку.)

0
28.01.2020, 03:03

Я бы использовал простой Perl-скрипт, который сделает всю работу за вас:

  1. вы передаете необходимое количество файлов и список файлов для обработки
  2. он вычисляет количество строк и сохраняет результаты в ассоциативном массиве
  3. сортирует массив по значению и выводит количество файлов

Ошибка -при проверке скрипта (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.

0
28.01.2020, 03:03

Теги

Похожие вопросы