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
?
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:
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
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
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)"
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