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


10

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

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

lalala
tatatata
abracadabra
mu mu mu

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

Ответы:


9

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

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

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

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

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

Ссылки:


3
@ don.joey: это сила Unix. Простые команды, которые могут работать вместе. здесь он ищет «^. {n} $», то есть любую строку, которая между началом строки ( ^) и ее концом ( $) имеет ровно n символов ( .{n}). Затем ему просто нужно найти n: для этого он использует GNU-изм, «wc -L filename» (обратите внимание, что это не posix), который возвращает длину самой длинной строки имени файла. Таким образом, он получает любую строку, имеющую самую длинную длину. $(cmd)заменяется на вывод cmd.
Оливье Дюлак

1
@OlivierDulac Отличный комментарий.
Раду Рэдяну

Более того, вы также можете добавить (например) -C 3к опциям grep, чтобы получить несколько строк до и после для контекста
ShadSterling

8

Вы можете использовать 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

@ user214965 смотрите мое обновление, номер строки отображается вторым номером в результате.
Аттила О.

Что делать, если есть 2 строки с одинаковой максимальной длиной?
Раду Рэдяну

@ RaduRădeanu хорошая точка. +1 wc -L, я не знал об этом аргументе. Это действительно очень полезно.
Аттила О.

4

AO (N) может быть достигнуто с помощью perl one liner:

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

использования (где machin - имя файла)

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

Гораздо эффективнее. Спасибо! Искал это.
test30

1
Работает с огромными файлами +1
h3xStream

0

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

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

или питон:

python -c "print max(open('$file', 'r'), key=len)"

0

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

#!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.