Centos7: awk는 utf16le을 지원합니까?

Centos7: awk는 utf16le을 지원합니까?

awk가 utf8을 처리할 수 있다는 것을 알고 있지만, 이를 위해서는 iconv를 사용한 이중 변환 단계가 필요합니다.

다음과 같이 말해보세요:

 iconv -f UTF-16 -t UTF-8 "$file" > "$fileTmp"
 #Perform operation 
 awk -F\| {print $1} $fileTmp > $awkFile
 iconv -f UTF-8 -t UTF-16 "$awkFile" > "$file"

내 문제는 ETL 프로세스 중에 여러 개의 멀티 기가비트 파일을 처리해야 할 때입니다. 200개가 넘는 파일이 포함된 10개 폴더의 각 파일을 처리하는 데 왕복하는 데 100초가 걸린다고 계산하면 변환 시간이 꽤 빨리 늘어납니다!

UTF16LE를 기본적으로 처리할 수 있는 AWK 버전이나 확장이 있습니까?

답변1

POSIX 시스템에서 UTF-16을 사용하는 로케일은 C 로케일과 호환되지 않으므로 사용할 수 없습니다.

GNU를 사용하면 다음 awk을 수행할 수 있습니다.

LC_ALL=C awk -v RS='\n\0' -v ORS='\n\0' -F '[|]\0' '{print $1}'

즉, 입력을 바이트 스트림으로 처리하되 레코드 및 필드 구분 기호를 2바이트 UTF-16LE 인코딩으로 설정합니다.

이제 입력에 다음이 포함된 경우:

<U+0AFF><U+FF00>

이는 다음과 같이 인코딩됩니다 FF0A00FF(따라서 \n\0레코드 구분 기호 포함).

UTF-8로 변환하는 것이 유일하게 신뢰할 수 있는 옵션인 것 같습니다. 하지만 임시 파일을 사용할 필요는 없습니다(로케일의 문자 맵이 UTF-8이라고 가정함).

< file.in iconv -f UTF-16LE |
  awk -F'|' '{print $1}' |
  iconv -t UTF-16LE > file.out

|UTF-8 이외의 다른 문자 는 바이트(0x7c)를 포함할 수 없으므로 |(개행 문자 또는 이식 가능한 문자 집합의 모든 문자에 대해 동일) 다음을 위해 C 로케일을 사용하거나 awk다음을 사용하여 최적화할 수도 있습니다 cut.

< file.in iconv -f UTF-16LE -t UTF-8 |
  LC_ALL=C cut -d '|' -f1 |
  iconv -f UTF-8 -t UTF-16LE > file.out

관련 정보