scripts script salto pasar parametros operaciones manejo linea eliminar ejemplos ejecutar comando cadenas aritmeticas bash shell utilities

bash - script - sed eliminar salto de linea



La línea más larga en un archivo (13)

Aquí hay referencias del anwser

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

http://wtanaka.com/node/7719

Estoy buscando una manera simple de encontrar la longitud de la línea más larga en un archivo. Idealmente, sería un comando simple de shell bash en lugar de un script.


En perl:

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

esto solo imprime la línea, no su longitud también.


Estoy en un entorno Unix y trabajo con archivos gzip que tienen unos pocos GB de tamaño. Probé los siguientes comandos usando un archivo de 2 GB con gzip con una longitud de registro de 2052.

  1. zcat <gzipped file> | wc -L

y

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

Los tiempos estaban en avarage

  1. 117 segundos

  2. 109 segundos

Aquí está mi script después de aproximadamente 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"


Parece que toda la respuesta no da 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 aproximadamente la 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


Punto importante pasado por alto en los ejemplos anteriores.

Los siguientes 2 ejemplos cuentan las pestañas expandidas

wc -L <"${SourceFile}" # or expand --tabs=1 "${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}"

asi que

Expanded nonexpanded $''nn/tnn'' 10 5


Solo por diversión y propósito educativo, la solución de shell POSIX pura , sin uso inútil de cat y sin bifurcaciones a comandos externos. Toma el nombre del 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"


Solo por diversión, aquí está la versión de Powershell:

cat filename.txt | sort length | select -last 1

Y para obtener la longitud:

(cat filename.txt | sort length | select -last 1).Length


Usando wc (GNU coreutils) 7.4:

wc -L filename

da:

101 filename


Variación sobre el tema.

Éste 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


awk ''{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'' YOURFILE



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 de línea y longitudes

. es el operador de concatenación - se usa aquí después de la longitud ()
$. es el número de línea actual
$_ es la línea actual


wc -L < filename

da

101