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

В форуме VirtualBox есть сообщение на форуме, напрямую связанное с Ubuntu Desktop 12.10 и работающее 3D-ускорение. Есть определенные смешанные результаты.

Ubuntu 12.10 «Практически» Невозможно

1
задан 12 November 2013 в 16:08

4 ответа

Вы можете использовать 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
6
ответ дан 24 May 2018 в 15:22
  • 1
    @ user214965, пожалуйста, см. мое обновление, номер строки, отображаемой на дисплее, является вторым номером в результате. – Attila O. 12 November 2013 в 15:57
  • 2
    Что делать, если есть две линии с одинаковой максимальной длиной? – Radu Rădeanu 12 November 2013 в 16:09
  • 3
    @ RaduRădeanu хороший пункт. +1 для wc -L, я не знал об этом аргументе. Это очень полезно. – Attila O. 12 November 2013 в 20:31

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

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
3
ответ дан 24 May 2018 в 15:22

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
ответ дан 24 May 2018 в 15:22

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

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

# Additional check, in case the file doesn't end in newline    
if [ -n "$line" ]
then

    if [ "${#line}" -gt "$longest_length" ]
    then
        longest_length="${#line}"
        longest_string="$line"
    fi
fi

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
ответ дан 24 May 2018 в 15:22

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

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