Je cherche un moyen simple de trouver la longueur de la plus longue ligne d'un fichier. Idéalement, ce serait une simple commande shell bash au lieu d'un script.
Je cherche un moyen simple de trouver la longueur de la plus longue ligne d'un fichier. Idéalement, ce serait une simple commande shell bash au lieu d'un script.
Réponses:
Utilisation de wc (GNU coreutils) 7.4:
wc -L filename
donne:
101 filename
-L
dépend des paramètres régionaux. Certains caractères (à la fois dans l'octet et dans le sens multi-octets) peuvent même ne pas être comptés du tout!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
est dans la coreutils
formule, qui installe tous les coreutils GNU avec un g
préfixe.
awk '{print length, $0}' Input_file |sort -nr|head -1
Pour référence : recherche de la ligne la plus longue dans un fichier
END{}
bloc.
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
awk 'length>max{max=length}END{print max}' file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Juste pour le plaisir et l'éducation, la solution shell POSIX pure , sans utilisation inutile de chat et sans bifurquer vers des 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"
< "$1"
cela, il peut facilement lire depuis stdin. Avec un test, $#
il pourrait même faire les deux, selon le nombre d'arguments. Il n'y a tout simplement pas besoin de chats inutiles dans ce monde. Les débutants devraient être enseignés en conséquence dès le début.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Imprime la longueur, le numéro de ligne et le contenu de la ligne la plus longue
perl -ne 'print length()." line $. $_"' myfile | sort -n
Imprime une liste triée de toutes les lignes, avec les numéros de ligne et les longueurs
.
est l'opérateur de concaténation - il est utilisé ici après la longueur ()
$.
est le numéro de ligne actuel
$_
est la ligne actuelle
wc -L
est la meilleure solution que j'ai vue jusqu'à présent.
wc -L
3 secondes
wc -L
il suffit de compter les enregistrements de nombre - ce Q était sur le point de trouver la ligne la plus longue - pas tout à fait la même, donc ce n'est pas une comparaison précise.
Point important négligé dans les exemples ci-dessus.
Les 2 exemples suivants comptent les onglets développés
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Les 2 onglets suivants ne sont pas étendus.
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 la 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
awk '{print length}' test.txt | sort -rn | head -1
. Si vous avez également besoin du contenu de la ligne, alors awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Voici les références de la réponse
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 pour obtenir juste la longueur:
(cat filename.txt | sort length | select -last 1).Length
sort
prendre filename.txt comme argument? Ensuite, le chat est inutile car sort length filename.txt | select -last 1
évite un tuyau et un processus qui ne fait que copier les données.
Je suis dans un environnement Unix et je travaille avec des fichiers compressés de quelques 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 runs.
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"
awk
version bénéficie de la mise en cache de bloc de disque de la wc
version qui s'exécute en premier (et amorce le cache de disque). Vous devez randomiser l'ordre des personnes appelées en premier au cours des dix manches pour que cet argument reste fidèle.
Variation sur le thème.
Celui-ci montrera toutes les lignes ayant la longueur de la plus longue ligne trouvée dans le fichier, en conservant l'ordre dans lequel elles apparaissent dans la source.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Alors monfichier
x
mn
xyz
123
abc
va donner
xyz
123
abc
Si vous utilisez MacOS et obtenez cette erreur:
wc: illegal option -- L
vous n'avez pas besoin d'installer GNU sipmly.
Si tout ce que vous voulez faire, c'est simplement obtenir le nombre de caractères dans la plus longue ligne du fichier et vous utilisez OS X run:
awk '{print length}' "$file_name" | sort -rn | head -1
Quelque chose comme ça;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Les sorties:
The longest line in the file my_file has 117 characters
-c -l -m -w
options sont POSIX.-L
est un GNUisme.