web-dev-qa-db-fra.com

Obtenir la longueur de la plus longue ligne dans un fichier

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.

183
Andrew Prock

Utilisation de wc (GNU coreutils) 7.4:

wc -L filename

donne:

101 filename
247
Daniel
awk '{print length, $0}' Input_file |sort -nr|head -1

Pour référence: Recherche de la plus longue ligne dans un fichier

95
Pale Blue Dot
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 
64
Ramon

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"
23
Jens
wc -L < filename

donne

101
13
Anonymous
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

11
Chris Koknat

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
5
John Kearney

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
4
wangf

Voici les références de la réponse

cat filename | awk '{print length, $0}'|sort -nr|head -1

http://wtanaka.com/node/7719

3
Nadir SOUALEM

En Perl:

Perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1

cela n'imprime que la ligne, pas sa longueur aussi.

3
rsp

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.

  1. zcat <gzipped file> | wc -L

et

  1. zcat <gzipped file> | awk '{print length}' | sort -u

Les temps étaient en moyenne

  1. 117 secondes

  2. 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"
2
Jon

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
2
eddiegroves

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
1
martin clayton