Я ищу простой способ найти длину самой длинной строки в файле. В идеале это будет простая команда оболочки bash вместо скрипта.
Я ищу простой способ найти длину самой длинной строки в файле. В идеале это будет простая команда оболочки bash вместо скрипта.
Ответы:
Использование wc (GNU coreutils) 7.4:
wc -L filename
дает:
101 filename
-L
зависит от локали. Некоторые символы (как в байтовом, так и в многобайтовом смысле) могут даже не учитываться вообще!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
в coreutils
формуле, которая устанавливает все coreutils GNU с g
префиксом.
awk '{print length, $0}' Input_file |sort -nr|head -1
Для справки: поиск самой длинной строки в файле
END{}
блока.
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
awk 'length>max{max=length}END{print max}' file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Просто для забавы и в образовательных целях - чистое решение для оболочки POSIX , без бесполезного использования cat и без разветвлений для внешних команд. Принимает имя файла в качестве первого аргумента:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
него его можно легко прочитать из стандартного ввода. С тестом на $#
это можно было бы сделать и то и другое, в зависимости от количества аргументов. В этом мире просто нет нужды в бесполезных кошках. Новичков нужно учить соответственно с самого начала.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Печать длины, номера строки и содержимого самой длинной строки
perl -ne 'print length()." line $. $_"' myfile | sort -n
Печатает отсортированный список всех строк, с номерами строк и длинами
.
является оператором конкатенации - он используется здесь после того, как length ()
$.
является текущим номером строки
$_
- текущая строка
wc -L
лучшее решение, которое я видел до сих пор.
wc -L
заняло 3 секунды
wc -L
просто посчитайте количество записей - этот Q собирался найти самую длинную строку - не совсем то же самое, так что это не точное сравнение.
Важный упущенный момент в приведенных выше примерах.
Следующие 2 примера подсчитывают расширенные вкладки
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Следующие 2 считают не развернутые вкладки.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
так
Expanded nonexpanded
$'nn\tnn' 10 5
Похоже, все ответы не дают номер строки самой длинной строки. Следующая команда может дать номер строки и приблизительную длину:
$ cat -n test.txt | awk '{print "longest_line_number: " $1 " 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
awk '{print length}' test.txt | sort -rn | head -1
, Если вам тоже нужен фактический контент строки awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Вот ссылки на ответ
cat filename | awk '{print length, $0}'|sort -nr|head -1
Просто для удовольствия, вот версия Powershell:
cat filename.txt | sort length | select -last 1
И просто получить длину:
(cat filename.txt | sort length | select -last 1).Length
sort
взять filename.txt в качестве аргумента? Тогда кошка бесполезна, потому что sort length filename.txt | select -last 1
избегает канала и процесса, который просто копирует данные.
Я работаю в среде Unix и работаю с сжатыми файлами размером в несколько ГБ. Я протестировал следующие команды, используя сжатый файл размером 2 ГБ с длиной записи 2052.
zcat <gzipped file> | wc -L
и
zcat <gzipped file> | awk '{print length}' | sort -u
Время было в среднем
117 секунд
109 секунд
Вот мой сценарий после 10 пробежек.
START=$(date +%s) ## time of start
zcat $1 | wc -L
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
START=$(date +%s) ## time of start
zcat $1 | awk '{print length}' | sort -u
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
awk
версия выигрывает от кеширования дискового блока той wc
версии, которая запускается первой (и заполняет кэш диска). Вам нужно было бы рандомизировать порядок вызова первыми за десять прогонов, чтобы этот аргумент оставался неизменным.
Вариация на тему.
Эта строка покажет все строки, имеющие длину самой длинной строки в файле, сохраняя порядок, в котором они отображаются в источнике.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Итак, мой файл
x
mn
xyz
123
abc
дам
xyz
123
abc
Если вы используете MacOS и получаете эту ошибку:
wc: illegal option -- L
вам не нужно устанавливать GNU sipmly, сделайте это.
Если все, что вы хотите сделать, это просто получить количество символов в самой длинной строке файла, и вы используете OS X, запустите:
awk '{print length}' "$file_name" | sort -rn | head -1
Что-то вроде этого;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Выходы:
The longest line in the file my_file has 117 characters
-c -l -m -w
параметры POSIX.-L
это GNUism.