특정 길이보다 긴 선 찾기

특정 길이보다 긴 선 찾기

파일에서 79자를 초과하는 행을 찾을 수 있습니까?

답변1

내 테스트에 따르면 속도가 감소하는 순서대로(UTF-8 로케일 및 ASCII 입력을 사용하는 GNU 시스템에서):

grep '.\{80\}' file

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

awk 'length>79' file

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

perl1(또는 awk// 멀티바이트 문자(예: busybox)를 지원하지 않는 구현)을 제외하고 문자 길이를 grep계산합니다 .sedmawk수치(로케일 설정에 따라 LC_CTYPE) 대신바이트.

입력의 일부 바이트가 유효한 문자의 일부를 형성하지 않는 경우(로케일의 문자 집합이 UTF-8이고 입력이 다른 인코딩일 때 발생하는 경우가 있음) 솔루션 및 도구 구현에 따라 이러한 바이트 수는 다음과 같습니다. 1자, 0 또는 일치 항목 없음으로 표시됩니다 ..

예를 들어, UTF-8 로케일에서 30 asa 0x80 바이트, 30 bs, 0x81 바이트 및 30 UTF-8 s(0xc3 0xa9로 인코딩됨) 로 구성된 줄은 éGNU/와 일치하지 않습니다(독립적인 0x80 바이트 때문에). 섹션이 일치하지 않음), or를 사용할 경우 길이는 30+1+30+1+2*30=122이고, or를 사용할 경우 길이는 3*30=90입니다..\{80\}grepsed.perlmawkgawk

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

이로 인해 4가지 솔루션 모두 위 줄에 122자가 포함되어 있다고 생각하게 됩니다. GNU 도구를 제외하고 perlNUL 문자(0x0 바이트)가 포함된 줄은 여전히 ​​잠재적으로 문제가 있습니다.


perl동작은 환경 변수의 영향을 받을 수 있지만PERL_UNICODE

답변2

쉘 방법:

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 의 경우

관련 정보