특정 길이를 초과하는 줄 찾기


답변:


89

내 테스트에 따라 속도를 줄이려면 (UTF-8 로켈의 GNU 시스템 및 ASCII 입력) :

grep '.\{80\}' file

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

awk 'length>79' file

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

제외 perl¹ 하나 (또는에 대한 awk/ grep/ sed같은 구현 ( mawk멀티 바이트 문자를 지원하지 않거나 비지 박스))의 수를 기준으로 길이를 계산 합니다 (에 따라 LC_CTYPE대신 로케일의 설정) 바이트 .

입력에 유효한 문자의 일부를 구성하지 않는 바이트가있는 경우 (로케일의 문자 세트가 UTF-8이고 입력이 다른 인코딩 일 때 발생하는 경우가 있음) 솔루션 및 도구 구현에 따라 해당 바이트 1 자로 계산되거나 0 또는 일치하지 않습니다 ..

예를 들어, 라인 (30)으로 구성되어 그 a사행을 0x80 바이트, 30 bS, A를 0x81 바이트 30 UTF-8 é일치하지 것 UTF-8 로케일에서, S (0xc3의 0xa9로 인코딩) .\{80\}GNU로 grep/ sed(즉 독립형을 0x80 바이트로서 .) 와 일치하지 않는 경우 길이가 30 + 1 + 30 + 1 + 2 * 30 = 122 perl또는 mawk이고 3 * 30 = 90입니다 gawk.

바이트 단위로 계산하려면 로케일을 C로 수정하십시오 LC_ALL=C grep/awk/sed....

위의 줄에 122자가 포함되어 있다고 생각하는 4 가지 솔루션이 모두 있습니다. in perl및 GNU 도구를 제외하고 NUL 문자 (0x0 바이트)를 포함하는 행에 대해서는 여전히 잠재적 인 문제가 있습니다.


¹ perl동작은 PERL_UNICODE환경 변수의 영향을받을 수 있습니다


"효율적"은 무엇을 의미합니까?
rowantran

manatwork는 입력 효율성을 의미한다고 생각합니다. awk당신이 드롭하면 더 가까이 올 수 있습니다 ($0). 어쨌든 암시 적입니다.).
Thor

9
BTW, 정규 표현식을로 시작 부분에 고정하면 ^약간 빠릅니다 grep '^.\{80\}' file.
cas

4
펄 솔루션은 다른 모든 솔루션과 달리 UTF-8과 같은 가변 크기 인코딩을 고려하지 않습니다.
BatchyX

6
충분히 큰 N 값은 grep으로 실패하지만 awk로 성공합니다. (예를 들어, grep '^.\{1000\}' file반환 grep: invalid repetition count(s), 동안은 awk 'length>1000' file성공합니다.)
mdahlman

1

쉘 접근 방식 :

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

파이썬 접근법 :

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

또는 가독성을위한 짧은 스크립트로 :

#!/usr/bin/env python
import sys

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

\n계산에서 개행 문자를 제외하려면 if len(line) > 79다음을 수행하십시오.if len(line.strip()) > 79

참고 사항 : 이것은 Python 2.7 구문입니다. 사용 print()파이썬 3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.