Encuentra cualquier línea que exceda una cierta longitud

Encuentra cualquier línea que exceda una cierta longitud

¿Es posible encontrar líneas en un archivo que superen los 79 caracteres?

Respuesta1

En orden de velocidad decreciente (en un sistema GNU en una configuración regional UTF-8 y en entrada ASCII) según mis pruebas:

grep '.\{80\}' file

perl -nle 'print if length$_>79' file

awk 'length>79' file

sed -n '/.\{80\}/p' file

Excepto por el perl¹ (o para implementaciones awk// (como o ocupadobox grep) que no admiten caracteres multibyte), que cuenta la longitud en términos de número desedmawkcaracteres(según la LC_CTYPEconfiguración local) en lugar debytes.

Si hay bytes en la entrada que no forman parte de caracteres válidos (lo que sucede a veces cuando el juego de caracteres de la configuración regional es UTF-8 y la entrada tiene una codificación diferente), entonces, dependiendo de la solución y la implementación de la herramienta, esos bytes contará como 1 carácter, 0 o no coincidirá ..

Por ejemplo, una línea que consta de 30 asa 0x80 bytes, 30 bs, un 0x81 bytes y 30 UTF-8 és (codificados como 0xc3 0xa9), en una configuración regional UTF-8 no coincidiría .\{80\}con GNU grep/ sed(ya que ese byte 0x80 independiente no coincide .), tendría una longitud de 30+1+30+1+2*30=122 con perlo mawk, 3*30=90 con gawk.

Si desea contar en términos de bytes, arregle la configuración regional Ccon LC_ALL=C grep/awk/sed....

Eso haría que las 4 soluciones consideraran que la línea anterior contiene 122 caracteres. Excepto en perllas herramientas GNU, aún tendría problemas potenciales para las líneas que contienen caracteres NUL (byte 0x0).


¹ aunque el perlcomportamiento puede verse afectado por la variable de entornoPERL_UNICODE

Respuesta2

Enfoque de caparazón:

while IFS= read -r line || [ -n "$line" ];
do 
    [ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt

Enfoque de Python:

python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt

O como un guión breve para facilitar la lectura:

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
    for line in f:
        if len(line) > 79:
            print line.strip()

Si quisiéramos excluir el carácter de nueva línea \nde los cálculos, podemos if len(line) > 79hacerloif len(line.strip()) > 79

Nota al margen: esta es la sintaxis de Python 2.7. Usar print()para Python 3

información relacionada