Obtiene la longitud de la línea más larga de un archivo
Pregunta
Estoy buscando una manera simple de encontrar la longitud de la línea más larga en un archivo. Lo ideal sería un simple comando shell bash en lugar de una secuencia de comandos.
Solución
Uso de wc (coreutils GNU) 7.4:
wc -L filename
da:
101 filename
Otros consejos
awk '{print length, $0}' Input_file |sort -nr|head -1
A modo de referencia: Encontrar la línea más larga en un archivo
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
Sólo por diversión y finalidad educativa, la POSIX pura solución de la envoltura , sin el uso inútil de gato 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"
wc -L < filename
da
101
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
imprime la longitud, 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 los números de línea y longitudes
.
es el operador de concatenación - se utiliza aquí después de longitud ()
$.
es el número de línea actual
$_
es la línea actual
punto vecinos Importante en los ejemplos anteriores.
Los siguientes 2 ejemplos recuento de fichas expandido
wc -L <"${SourceFile}"
# or
expand --tabs=1 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
La siguiente 2 recuento de fichas no expaned.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
so
Expanded nonexpanded
$'nn\tnn' 10 5
Se ve toda la respuesta que no se dé el número de línea de la línea más larga. Siguiente comando puede dar el número de línea y más o menos longitud:
$ 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
esto sólo se imprime la línea, no su longitud también.
Aquí hay referencias de la anwser
cat filename | awk '{print length, $0}'|sort -nr|head -1
Sólo por diversión, aquí está la versión Powershell:
cat filename.txt | sort length | select -last 1
Y para obtener sólo la longitud:
(cat filename.txt | sort length | select -last 1).Length
Estoy en un entorno Unix, y trabajar con ficheros comprimidos que son unos pocos GB de tamaño. Probé los siguientes comandos utilizando un archivo gzip 2 GB con longitud de registro de 2052.
-
zcat <gzipped file> | wc -L
y
-
zcat <gzipped file> | awk '{print length}' | sort -u
Los tiempos eran en avarage
-
117 segundos
-
109 segundos
Aquí está mi script después de 10 carreras.
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"
La variación en el tema.
Éste mostrará todos líneas que tienen 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
Así mi_archivo
x
mn
xyz
123
abc
dará
xyz
123
abc