파일에서 79자를 초과하는 행을 찾을 수 있습니까?
답변1
내 테스트에 따라 속도가 감소하는 순서(UTF-8 로케일의 GNU 시스템 및 ASCII 입력):
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
perl
1개(또는 멀티바이트 문자를 지원하지 않는 awk
/ grep
/ sed
구현(예 : busybox)의 경우) 를 제외하고 mawk
, 이는 문자 수로 길이를 계산합니다.문자LC_CTYPE
( 로캘 설정 에 따라 ) 대신바이트.
입력에 유효한 문자의 일부를 형성하지 않는 바이트가 있는 경우(로케일의 문자 집합이 UTF-8이고 입력이 다른 인코딩일 때 발생하는 경우가 있음) 솔루션 및 도구 구현에 따라 해당 바이트 1자로 계산되거나 0 또는 일치하지 않습니다 .
.
예를 들어, UTF-8 로케일에서 30 a
sa 0x80 바이트, 30 b
s, 0x81 바이트 및 30 UTF-8 s(0xc3 0xa9로 인코딩됨) 로 구성된 줄은 GNU / 와 일치하지 않습니다 (독립형 0x80 바이트이므로). 일치하지 않음 ), 길이는 또는 의 경우 30+1+30+1+2*30=122 , 의 경우 3*30=90입니다 .é
.\{80\}
grep
sed
.
perl
mawk
gawk
바이트 단위로 계산하려면 로케일을 로 수정 C
하세요 LC_ALL=C grep/awk/sed...
.
그러면 4가지 솔루션 모두 위 줄에 122자가 포함되어 있다고 간주됩니다. In perl
및 GNU 도구를 제외하고 NUL 문자(0x0 바이트)가 포함된 줄에는 여전히 잠재적인 문제가 있습니다.
¹ 동작은 환경 변수 perl
의 영향을 받을 수 있지만PERL_UNICODE
답변2
쉘 접근 방식:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
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
또는 가독성을 위한 짧은 스크립트로:
#!/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()
Python 3에 사용