Как получить самую длинную строку из файла?

Мне интересно узнать номер самой длинной строки из файла.

Например, если у меня есть файл со следующим содержимым:

lalala
tatatata
abracadabra
mu mu mu

, как мне написать скрипт bash, который выдаст мне что-то вроде этого: 3 -> abracadabra?

9
задан 12 November 2013 в 14:08

5 ответов

Вам не нужен сценарий для этого. Достаточно простой команды:

egrep -n "^.{$(wc -L < filename)}$" filename

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

Если вы хотите, чтобы выходные данные были точно в этой форме: 3 -> abracadabra, то используйте:

egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'

Ссылки:

0
ответ дан 12 November 2013 в 14:08

Вы могли использовать awk распечатать длину каждой строки (length()) и номер строки (NR), затем инвертируйте (-r) sort результат числом (-n):

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala

Показать просто первую строку:

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr
8
ответ дан 12 November 2013 в 14:08

O (N) может быть достигнут с жемчугом один лайнер:

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

использования (где машина является именем файла),

cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

или

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin

или (менее ясный, но короче)

perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin
4
ответ дан 12 November 2013 в 14:08

O (n) Для машин, например, OpenWRT, где жемчуг не доступен, @awk версия, мог бы быть полезным.

awk 'length > l {l=length;line=$0} END {print line}' FILE

или Python:

python -c "print max(open('$file', 'r'), key=len)"
0
ответ дан 12 November 2013 в 14:08

Ответ Раду вполне достаточен и предпочтителен, хотя, если вы хотите более явное и основанное на оболочке решение, вы можете использовать следующий скрипт:

#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
    if [ "${#line}" -gt "${longest_length}" ]
    then
        longest_length="${#line}"
        longest_string="$line"
    fi
done < "$1"

echo "${longest_string}"

Использование: ./find_longest.sh input.txt

Пример:

$ cat input.txt                                                          
1 2 
2 3 a a a a
4 5 6 
1 1 1 5

$ ./find_longest.sh input.txt                                            
2 3 a a a a
0
ответ дан 12 November 2013 в 14:08

Другие вопросы по тегам:

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