Je cherche un moyen simple de trouver la longueur de la plus longue ligne d'un fichier. Idéalement, il s'agirait d'une simple commande shell bash au lieu d'un script.
Utilisation de wc (GNU coreutils) 7.4:
wc -L filename
donne:
101 filename
awk '{print length, $0}' Input_file |sort -nr|head -1
Pour référence: Recherche de la plus longue ligne dans un fichier
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
Juste pour le plaisir et à des fins éducatives, la solution POSIX Shell pure, sans utilisation inutile de chat et sans falsification de commandes externes. Prend le nom de fichier comme premier argument:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
wc -L < filename
donne
101
Perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Imprime la longueur, le numéro de ligne et le contenu de la plus longue ligne
Perl -ne 'print length()." line $. $_"' myfile | sort -n
Imprime une liste triée de toutes les lignes, avec leurs numéros et leurs longueurs
.
est l'opérateur de concaténation - il est utilisé ici après length ()$.
est le numéro de ligne actuel$_
est la ligne en cours
Point important négligé dans les exemples ci-dessus.
Les 2 exemples suivants comptent des onglets développés
wc -L <"${SourceFile}"
# or
expand --tabs=1 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Les 2 onglets suivants non développés sont pris en compte.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
alors
Expanded nonexpanded
$'nn\tnn' 10 5
On dirait que toute la réponse ne donne pas le numéro de ligne de la plus longue ligne. La commande suivante peut donner le numéro de ligne et sa longueur approximative:
$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11
Voici les références de la réponse
cat filename | awk '{print length, $0}'|sort -nr|head -1
En Perl:
Perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1
cela n'imprime que la ligne, pas sa longueur aussi.
Je suis dans un environnement Unix et je travaille avec des fichiers compressés d’une taille pouvant aller jusqu’à 4 Go. J'ai testé les commandes suivantes en utilisant un fichier compressé de 2 Go avec une longueur d'enregistrement de 2052.
zcat <gzipped file> | wc -L
et
zcat <gzipped file> | awk '{print length}' | sort -u
Les temps étaient en moyenne
117 secondes
109 secondes
Voici mon script après environ 10 courses.
START=$(date +%s) ## time of start
zcat $1 | wc -L
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
START=$(date +%s) ## time of start
zcat $1 | awk '{print length}' | sort -u
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
Juste pour le plaisir, voici la version de Powershell:
cat filename.txt | sort length | select -last 1
Et pour obtenir juste la longueur:
(cat filename.txt | sort length | select -last 1).Length
Variation sur le thème.
Celui-ci montrera toutes lignes ayant la longueur de la plus longue ligne trouvée dans le fichier, en conservant l'ordre dans lequel elles apparaissent dans le source.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Alors mon fichier
x
mn
xyz
123
abc
va donner
xyz
123
abc