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.

¿Fue útil?

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

http://wtanaka.com/node/7719

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.

  1. zcat <gzipped file> | wc -L

y

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

Los tiempos eran en avarage

  1. 117 segundos

  2. 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top