it-swarm-eu.dev

Najděte jakékoli řádky překračující určitou délku

Je možné najít v souboru nějaké řádky, které přesahují 79 znaků?

57
rowantran

V pořadí klesající rychlosti (na systému GNU v národním prostředí UTF-8 a na ASCII vstup)) podle mých testů:

grep '.\{80\}' file

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

awk 'length>79' file

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

Kromě implementace Perl¹ (nebo implementace awk/grep/sed (jako mawk nebo busybox), které nepodporují vícebajtové znaky), které počítají délku v počtu znaků (podle LC_CTYPE nastavení národního prostředí) místo bajtů.

Pokud jsou ve vstupu bajty, které netvoří součást platných znaků (což se stává někdy, když je znaková sada národního prostředí UTF-8 a vstup je v jiném kódování), pak v závislosti na řešení a implementaci nástroje, tyto bajty bude počítat buď jako 1 znak, nebo 0 nebo neodpovídá ..

Například řádek, který se skládá z 30 as 0x80 bajtů, 30 bs, 0x81 bajtů a 30 UTF-8 és (kódováno jako 0xc3 0xa9), v národním prostředí UTF-8 by neodpovídalo .\{80\} with GNU grep/sed (protože tento samostatný 0x80 bajt neodpovídá .), měl by délku 30 + 1 + 30 + 1 + 2 * 30 = 122 s Perl nebo mawk, 3 * 30 = 90 s gawk.

Pokud chcete počítat v bajtech, upravte národní prostředí na C pomocí LC_ALL=C grep/awk/sed....

To by mělo všechna 4 řešení za to, že řádek výše obsahuje 122 znaků. Kromě nástrojů Perl a GNU=) byste stále měli potenciální problémy pro řádky, které obsahují znaky NUL (0x0 bajtů).


¹ chování Perl může být ovlivněno Perl_UNICODE proměnná prostředí ačkoli

95
manatwork

Shell přístup:

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

Pythonský přístup:

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

Nebo jako krátký skript pro čitelnost:

#!/usr/bin/env python
import sys

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

Pokud bychom chtěli vyloučit znak nového řádku \n Z výpočtů, můžeme udělat if len(line) > 79 být if len(line.strip()) > 79

Vedlejší poznámka: toto je Python 2,7 syntaxe.) Použijte print() pro Python 3)

1