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