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
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.
-
zcat <gzipped file> | wc -L
y
-
zcat <gzipped file> | awk ''{print length}'' | sort -u
Los tiempos estaban en avarage
117 segundos
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
cat filename|awk ''{print length, $0}''|sort -nr|head -1
Para referencia: Encontrar la línea más larga en un archivo
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