Risposte:
In ordine decrescente di velocità (su un sistema GNU in una locale UTF-8 e su ingresso ASCII) secondo i miei test:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Tranne quella perl
¹ (o per awk
/ grep
/ sed
implementazioni (like mawk
o busybox) che non supportano caratteri multibyte), che conta la lunghezza in termini di numero di caratteri (in base LC_CTYPE
all'impostazione della locale) anziché byte .
Se ci sono byte nell'input che non fanno parte di caratteri validi (ciò accade a volte quando il set di caratteri della locale è UTF-8 e l'input è in una codifica diversa), quindi a seconda della soluzione e dell'implementazione dello strumento, quei byte conterà come 1 carattere o 0 o non corrisponderà .
.
Ad esempio, una linea composta da 30 a
sa 0x80 byte, 30 b
s, un 0x81 byte e 30 UTF-8 é
s (codificato come 0xc3 0xa9), in una locale UTF-8 non corrisponderebbe .\{80\}
a GNU grep
/ sed
(in quanto tale 0x80 byte autonomo non corrisponde .
), avrebbe una lunghezza di 30 + 1 + 30 + 1 + 2 * 30 = 122 con perl
o mawk
, 3 * 30 = 90 con gawk
.
Se si desidera contare in termini di byte, correggere la locale C
con LC_ALL=C grep/awk/sed...
.
Tutte le 4 soluzioni dovrebbero considerare che la riga sopra contiene 122 caratteri. Ad eccezione degli perl
strumenti GNU e, avresti ancora potenziali problemi per le righe che contengono caratteri NUL (0x0 byte).
¹ il perl
comportamento può essere influenzato dalla PERL_UNICODE
variabile d'ambiente però
awk
può avvicinarsi se cadi ($0)
, il che è comunque implicito;).
^
, è leggermente più veloce: ad es grep '^.\{80\}' file
.
grep '^.\{1000\}' file
ritorna grep: invalid repetition count(s)
, mentre ci awk 'length>1000' file
riesce.)
Approccio Shell:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
Approccio 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 come una breve sceneggiatura per la leggibilità:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
Se volessimo escludere il carattere di nuova riga \n
dai calcoli, possiamo if len(line) > 79
essereif len(line.strip()) > 79
Nota a margine: questa è la sintassi di Python 2.7. Utilizzare print()
per Python 3