найти длину самой длинной строки во всех текстовых файлах в каталоге

16

Я знаю, как получить длину самой длинной строки в текстовом файле с awk

awk ' { if ( length > L ) { L=length} }END{ print L}' file.txt

но как я могу получить длину самой длинной строки из всех файлов в каталоге?

trupty
источник

Ответы:

11

Самое простое решение - объединить все файлы и передать результат в ваш скрипт:

cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'

Вы также можете напрямую передать несколько файлов в awk:

awk '{ if ( length > L ) { L=length} }END{ print L}' ./*

Конечно, могут быть некоторые предупреждения, если файлы на самом деле являются каталогами, но это должно быть безвредно. У вас могут быть большие проблемы с бинарными файлами, потому что они не имеют понятия строки . Итак, чтобы быть более конкретным, вы можете сделать что-то вроде

 awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt

сопоставлять только .txtфайлы в текущем каталоге.

И, как сказал @ G-Man в своем комментарии, *не будет совпадать со скрытыми файлами (начиная с точки). Если вы хотите, используйте * .*.

lgeorget
источник
Или, возможно, cat * .* | .... Или исключить бесполезное использование кошки и сказать awk '...' * .*.
G-Man говорит: «Восстановите Монику»
@ G-Man Действительно. Я редактировал свой ответ об этом, когда вы прокомментировали. :-) Я сказал самое простое, потому что объединение файлов с помощью cat было на первый взгляд проще.
lgeorget
4

С GNU wc:

cat *.txt|wc -L

-L печатает длину самой длинной строки.

LRI
источник
4

Если вы хотите максимальную длину для файла, с GNU awk:

find . -type f -exec awk -v l=0 '
   length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +

Или одна максимальная длина во всех файлах:

find . -type f -size +1c -exec cat {} + |
  awk -v l=0 'length>l {l=length}; END{print l}'

Это предполагает, что файлы заканчиваются символами новой строки. Если один файл не заканчивается символом новой строки, то его последняя не разделенная строка будет объединена с первой строкой следующего файла и, возможно, приведет к аннулированию вашего результата.

-size +1c Это оптимизация, так как текстовые файлы, которые являются пустыми или содержат только один символ, имеют соответственно 0 строк и 1 пустую строку, поэтому не будут иметь самую длинную строку.

Стефан Шазелас
источник
Это текстовые файлы, поэтому они заканчиваются символами новой строки (если они не пусты).
Жиль "ТАК - перестань быть злым"
0

Также с GNU wc (coreutils 8.4) он может обрабатывать несколько файлов

wc -L *.txt
  • перечисляет длину каждого отдельного файла
  • а также предоставить самую длинную длину всех файлов
Фрэнсис W
источник
По сути, это то, что упоминает другой ответwc -L , но у вашего решения есть недостаток, заключающийся в том, что вы сначала должны просмотреть максимальную длину всех остальных файлов. Есть ли в этом преимущество?
Anthon