Jawaban:
Untuk mengurangi kecepatan (pada sistem GNU di lokal UTF-8 dan pada input ASCII) menurut pengujian saya:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Kecuali untuk perl
¹ satu (atau untuk awk
/ grep
/ sed
implementasi (suka mawk
atau kotak sibuk) yang tidak mendukung karakter multi-byte), yang menghitung panjang dalam hal jumlah karakter (sesuai dengan LC_CTYPE
pengaturan lokal) bukan byte .
Jika ada byte dalam input yang tidak membentuk bagian dari karakter yang valid (yang kadang-kadang terjadi ketika set karakter lokal adalah UTF-8 dan input dalam pengkodean yang berbeda), maka tergantung pada solusi dan implementasi alat, byte tersebut akan dihitung sebagai 1 karakter, atau 0 atau tidak cocok .
.
Misalnya, sebuah garis yang terdiri dari 30 a
sa 0x80 byte, 30 b
s, 0x81 byte dan 30 UTF-8 é
(disandikan sebagai 0xc3 0xa9), di lokal UTF-8 tidak akan cocok .\{80\}
dengan GNU grep
/ sed
(seperti yang berdiri sendiri 0x80 byte tidak cocok .
), akan memiliki panjang 30 + 1 + 30 + 1 + 2 * 30 = 122 dengan perl
atau mawk
, 3 * 30 = 90 dengan gawk
.
Jika Anda ingin menghitung dalam bentuk byte, perbaiki lokal C
dengan LC_ALL=C grep/awk/sed...
.
Itu akan memiliki semua 4 solusi mempertimbangkan bahwa baris di atas berisi 122 karakter. Kecuali dalam perl
dan di alat GNU, Anda masih akan memiliki masalah potensial untuk baris yang berisi karakter NUL (0x0 byte).
¹ perl
perilaku dapat dipengaruhi oleh PERL_UNICODE
variabel lingkungan
awk
dapat datang lebih dekat jika Anda drop ($0)
, yang tersirat;).
^
, itu sedikit lebih cepat: misalnya grep '^.\{80\}' file
.
grep '^.\{1000\}' file
kembali grep: invalid repetition count(s)
, ketika awk 'length>1000' file
berhasil.)
Pendekatan shell:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
Pendekatan 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
Atau sebagai skrip pendek untuk dibaca:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
Jika kita ingin mengecualikan karakter baris baru \n
dari perhitungan, kita dapat membuat if len(line) > 79
menjadiif len(line.strip()) > 79
Catatan: ini adalah sintaks Python 2.7. Gunakan print()
untuk Python 3