Самая длинная строка в файле


Я ищу простой способ, чтобы найти длину самой длинной строки в файле. В идеале, это была бы простая команда оболочки bash вместо скрипта.

13 157

13 ответов:

использование wc (GNU coreutils) 7.4:

wc -L filename

выдает:

101 filename
cat filename|awk '{print length, }'|sort -nr|head -1

Для справки : поиск самой длинной строки в файле

awk '{ if (length() > max) {max = length(); maxline = } } END { print maxline }'  YOURFILE 

просто для развлечения и образовательных целей, к чистое решение оболочки POSIX, без бесполезного использования cat и без разветвления на внешние команды. Принимает имя файла в качестве первого аргумента:

#!/bin/sh

MAX=0 IFS=
while read -r line; do
  if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < ""
printf "$MAX\n"
wc -L < filename

дает

101
perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1

выводит длину, номер строки и содержимое самой длинной строки

perl -ne 'print length()."  line $.  $_"' myfile | sort -n

печать отсортированного списка всех строк с номерами строк и длинами

. является оператором конкатенации - он используется здесь после length ()
$. - это номер текущей строки
$_ текущая строка

важный упущенный момент в приведенных выше примерах.

следующие 2 примера подсчитывают развернутые вкладки

  wc -L  <"${SourceFile}" 
# or
  expand --tabs=1 "${SourceFile}" | awk '{ if (length() > max) {max = length()} } END { print max }'

следующие 2 подсчета не расширенных вкладок.

  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length() > max) {max = length()} } END { print max }' "${SourceFile}"

так

              Expanded    nonexpanded
$'nn\tnn'       10            5

в perl:

perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1

это только печатает линию, а не ее длину тоже.

вот ссылки на anwser

cat filename | awk '{print length, }'|sort -nr|head -1

http://wtanaka.com/node/7719

выглядит все ответ не дают номер строки самой длинной строки. Следующая команда может дать номер строки и примерно длину:

$ cat -n test.txt | awk '{print "longest_line_number: "  " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11

просто для удовольствия, вот версия Powershell:

cat filename.txt | sort length | select -last 1

и просто получить длину:

(cat filename.txt | sort length | select -last 1).Length

Я нахожусь в среде Unix и работаю с gzipped файлами размером в несколько GBs. Я протестировал следующие команды, используя 2 ГБ gzipped файл с длиной записи 2052.

  1. zcat <gzipped file> | wc -L

и

  1. zcat <gzipped file> | awk '{print length}' | sort -u

времена были в среднем

  1. 117 секунд

  2. 109 секунд

вот мой скрипт примерно через 10 работает.

START=$(date +%s) ## time of start

zcat  |  wc -L

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

START=$(date +%s) ## time of start

zcat  |  awk '{print length}' | sort -u

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

вариация на тему.

этот покажет все строки, имеющие длину самой длинной строки, найденной в файле, сохраняя порядок их появления в источнике.

FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE

Итак myfile

x
mn
xyz
123
abc

даст

xyz
123
abc