Obtenez longueur de la ligne la plus longue dans un fichier
Question
Je suis à la recherche d'un moyen simple de trouver la longueur de la ligne la plus longue dans un fichier. Idéalement, ce serait une simple commande shell bash au lieu d'un script.
La solution
Utilisation de wc (coreutils GNU) 7.4:
wc -L filename
donne:
101 filename
Autres conseils
awk '{print length, $0}' Input_file |sort -nr|head -1
Pour référence: Trouver la ligne la plus longue dans un fichier
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
Juste pour le plaisir et le but éducatif, la solution shell POSIX pur , sans utilisation inutile de chat et pas fork aux 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
imprimer une liste triée de toutes les lignes, avec les numéros de ligne et de longueurs
.
est l'opérateur de concaténation - il est utilisé ici après la longueur ()
$.
est le numéro de ligne en cours
$_
est la ligne courante
point négligé important dans les exemples ci-dessus.
Les 2 exemples suivants compter pattes élargies
wc -L <"${SourceFile}"
# or
expand --tabs=1 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
2 Comptage des pattes non expaned suivante.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
Expanded nonexpanded
$'nn\tnn' 10 5
Attend la seule réponse ne donne pas le numéro de ligne de la ligne la plus longue. commande suivante peut donner le numéro de ligne et à peu près la longueur:
$ 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
En perl:
perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1
imprime uniquement la ligne, pas sa longueur trop.
Voici les références du anwser
cat filename | awk '{print length, $0}'|sort -nr|head -1
Juste pour le plaisir, voici la version Powershell:
cat filename.txt | sort length | select -last 1
Et juste obtenir la longueur:
(cat filename.txt | sort length | select -last 1).Length
Je suis dans un environnement Unix, et travailler avec des fichiers gzip qui sont quelques GBs de taille. Je testé les commandes suivantes à l'aide d'un fichier gzippé 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 avarage
-
117 secondes
-
109 secondes
Voici mon script après 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"
Variation sur le thème.
Celui-ci affichera toutes les lignes ayant la longueur de la ligne la plus longue trouvée dans le fichier, en conservant l'ordre dans lequel ils apparaissent dans la source.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
monfichier
x
mn
xyz
123
abc
donnera
xyz
123
abc