web-dev-qa-db-fra.com

Comment obtenir la plus longue ligne d'un fichier?

Je suis intéressé de connaître le numéro de la plus longue ligne d'un fichier.

Par exemple, si j'ai un fichier avec le contenu suivant:

lalala
tatatata
abracadabra
mu mu mu

comment puis-je écrire un script bash qui me donnera une sortie comme celle-ci: 3 -> abracadabra?

9
user214965

Vous n'avez pas besoin d'un script pour faire cela. Une simple commande suffit:

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

Cela fonctionnera même si vous avez deux lignes ou plus avec la même longueur maximale.

Si vous voulez que la sortie se présente exactement sous cette forme: 3 -> abracadabra, utilisez:

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

Références:

8
Radu Rădeanu

Vous pouvez utiliser awk pour imprimer la longueur de chaque ligne (length()) et le numéro de ligne (NR), puis inverser (-r) sort le résultat par numéro (-n):

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

Pour afficher uniquement la première ligne:

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr
8
Attila O.

Un O(N) peut être obtenu avec un liner Perl one:

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

usages (où machin est un nom de fichier)

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

ou

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

ou (moins clair mais plus court)

Perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin
4
MUY Belgium

O (n) Pour les machines, par exemple OpenWRT, où Perl n'est pas disponible, @ awk @ version pourrait être utile.

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

ou python:

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

La réponse de Radu est parfaitement suffisante et préférable. Toutefois, si vous souhaitez une solution plus explicite et basée sur Shell, vous pouvez utiliser le script suivant:

#!/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}"

Utilisation: ./find_longest.sh input.txt

Exemple:

$ 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
Sergiy Kolodyazhnyy