한자만 추출

한자만 추출

이탈리아어와 중국어로 작성된 텍스트로 작업하고 있는데 AWK. 어떻게 해야 하나요?

나는 시도했다:

4E00 thru 9FFF (344 270 200 thru 351 277 277)[ 테스트에 필요한 중국어 유니코드 문자 범위 >"\343" and <"\352"(4자 UTF-8 코드 선택을 방지하기 위해)]:

{
f=0;
for ( i=1; i<=length; i++)
if(substr($0, i, 1)>"\343" &&substr($0, i, 1)<"\352")
f = 1 

print $f
}

하지만 오류 이상이 있습니다. 찾을 수 없어요

답변1

문제는 UTF-8 문자 스트림의 원시 바이트를 필터링하면 UTF-8 파일에서 유니코드 시퀀스의 일부를 먹게 되어 잘못된 바이트 시퀀스가 ​​발생한다는 것입니다. 그건 작동하지 않습니다. 대신, UTF-8을 이해하고 (원시 바이트가 아닌) 유니코드 데이터에 필터를 적용하는 도구를 사용해야 합니다.

awk어떤 구현을 사용하고 있는지 모르기 때문에 유니코드를 지원하는지 알 수 없습니다. 그러나 나는 Perl이 완전히 유니코드 안전하다는 것을 알고 있으므로 다음 Perl 한 줄짜리 코드가 작동해야 합니다.

perl -CS -p -e 's/[^\s\p{Han}]//g'

\s나는 당신이 보고 싶어할 것이라고 가정합니다 . 이 \p{Han}비트는 유니코드로 선언된 문자가 한자(즉, 한자)에 사용되는 것과 일치시키길 원한다는 것을 Perl에게 알려줍니다. 해당 범위에 포함되지 않은 구두점이 필요한지 모르겠습니다. 그렇다면 구두점도 추가해야 할 수도 있습니다.

그런 다음 범위를 선행 범위로 부정 ^하고 마지막으로 전역 대체 명령( s///g)에서 이를 인코딩하여 Perl에게 첫 번째 슬래시 뒤의 부분 인스턴스(부정된 범위 또는 "이 범위에 없는 모든 항목")를 다음으로 대체하도록 지시합니다. 두 번째 이후와 세 번째 이전의 부분(즉, 없음).

여러 범위를 포함할 필요가 없는 경우 [^]구성을 중단하고 동일한 일치 반전을 수행하는 \Pnot 사용으로 전환할 수 있습니다.\p

남은 것은 우리가 입력한 문자 범위(한자의 유니코드 문자와 공백)입니다.

자세한 내용은 다음을 참조하세요.perldoc perlrePerl이 정규 표현식을 처리하는 방법에 대한 설명perldoc perluniprops\p{}가능한 유니코드 속성( 또는 구문 에 배치할 수 있는 비트) 목록입니다 \P{}.

답변2

이것을 사용하면 awk다음을 수행할 수 있습니다.

awk '{for(i=1; i<=length;i++) if(substr($0,i,1)>="\xS_INDEX" && substr($0,i,1)<="\xE_INDEX"){printf substr($0,i,1);f=1;} if(f)printf "\n"; f=0}' filename

.ascii 의 시작 및 끝 인덱스는 다음 S_INDEX과 같습니다 .E_INDEXhex

입력의 경우:

1243
135
dgfsdaa
125
sdg124
sdf34

숫자만 선택: S_INDEX = 30 및 E_INDEX = 39

산출:

1243
135
125
124
34

관련 정보