Estoy buscando una manera simple de encontrar la longitud de la línea más larga en un archivo. Idealmente, sería un simple comando bash shell en lugar de un script.
Estoy buscando una manera simple de encontrar la longitud de la línea más larga en un archivo. Idealmente, sería un simple comando bash shell en lugar de un script.
Respuestas:
Usando wc (GNU coreutils) 7.4:
wc -L filename
da:
101 filename
-L
depende de la configuración regional. ¡Algunos caracteres (tanto en el byte como en el sentido multibyte) pueden incluso no contarse en absoluto!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
está en la coreutils
fórmula, que instala todos los coreutils de GNU con un g
prefijo.
awk '{print length, $0}' Input_file |sort -nr|head -1
Como referencia: encontrar la línea más larga en un archivo
END{}
bloque.
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
Solo por diversión y con fines educativos, la solución de shell POSIX pura , sin uso inútil de cat y sin bifurcación a comandos externos. Toma el nombre de archivo como primer argumento:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
puede leer fácilmente desde stdin. Con una prueba $#
incluso podría hacer ambas cosas, dependiendo de la cantidad de args. Simplemente no hay necesidad de gatos inútiles en este mundo. Los novatos deben ser enseñados en consecuencia desde el principio.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Imprime la longitud, el número de línea y el contenido de la línea más larga.
perl -ne 'print length()." line $. $_"' myfile | sort -n
Imprime una lista ordenada de todas las líneas, con números y longitudes de línea.
.
es el operador de concatenación: se usa aquí después de length ()
$.
es el número de línea actual
$_
es la línea actual
wc -L
Es la mejor solución que vi hasta ahora.
wc -L
tomó 3 segundos
wc -L
solo cuente los registros de números: esta Q estaba a punto de encontrar la línea más larga , no es exactamente lo mismo, por lo que esta no es una comparación precisa.
Punto importante pasado por alto en los ejemplos anteriores.
Los siguientes 2 ejemplos cuentan pestañas expandidas
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Los siguientes 2 cuentan pestañas no expandidas.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
entonces
Expanded nonexpanded
$'nn\tnn' 10 5
Parece que todas las respuestas no dan el número de línea de la línea más larga. El siguiente comando puede dar el número de línea y la longitud aproximada:
$ 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 también necesita el contenido real de la línea, entonces awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Aquí hay referencias de la respuesta
cat filename | awk '{print length, $0}'|sort -nr|head -1
Solo por diversión, aquí está la versión Powershell:
cat filename.txt | sort length | select -last 1
Y solo para obtener la longitud:
(cat filename.txt | sort length | select -last 1).Length
sort
tomar filename.txt como argumento? Entonces el gato es inútil porque sort length filename.txt | select -last 1
evita una tubería y un proceso que simplemente copia datos.
Estoy en un entorno Unix y trabajo con archivos comprimidos que tienen un tamaño de unos pocos GB. Probé los siguientes comandos usando un archivo comprimido de 2 GB con una longitud de registro de 2052.
zcat <gzipped file> | wc -L
y
zcat <gzipped file> | awk '{print length}' | sort -u
Los tiempos estaban en una avarage
117 segundos
109 segundos
Aquí está mi script después de aproximadamente 10 ejecuciones.
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
versión se beneficie del almacenamiento en caché del bloque de disco de la wc
versión que se está ejecutando primero (y genera la memoria caché del disco). Tendría que aleatorizar el orden de quién llama primero durante las diez carreras para que este argumento se mantenga.
Variación sobre el tema.
Este mostrará todas las líneas que tengan la longitud de la línea más larga encontrada en el archivo, conservando el orden en que aparecen en la fuente.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Entonces mi archivo
x
mn
xyz
123
abc
daré
xyz
123
abc
Si está utilizando MacOS y obtiene este error:
wc: illegal option -- L
no necesita instalar GNU sipmly, haga esto.
Si todo lo que quiere hacer es obtener el recuento de los caracteres en la línea más larga del archivo y está utilizando OS X run:
awk '{print length}' "$file_name" | sort -rn | head -1
Algo como esto;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Salidas:
The longest line in the file my_file has 117 characters
-c -l -m -w
opciones son POSIX.-L
Es un GNUismo.