Centos7: awk suportando utf16le?

0

Eu sei que o awk pode manipular utf8, no entanto, isso requer uma etapa de conversão duplex usando iconv

Diga algo como:

 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"

Meu problema com isso é quando eu preciso lidar com vários arquivos multi-gig que estão em um processo ETL. Considerando que são necessários 100 segundos para lidar com a ida e volta por arquivo em mais de 10 pastas com mais de 200 arquivos, a conversão é muito rápida!

Existe uma versão do AWK ou uma versão estendida que possa manipular UTF16LE nativamente?

    
por jjhayter 20.01.2017 / 06:50

1 resposta

0

Você não pode ter uma localidade que use UTF-16 em um sistema POSIX, pois isso não é compatível com a localidade C.

Com o GNU awk , você pode ser capaz de fazer:

LC_ALL=C awk -v RS='\n
<U+0AFF><U+FF00>
' -v ORS='\n
< file.in iconv -f UTF-16LE |
  awk -F'|' '{print $1}' |
  iconv -t UTF-16LE > file.out
' -F '[|]
< file.in iconv -f UTF-16LE -t UTF-8 |
  LC_ALL=C cut -d '|' -f1 |
  iconv -f UTF-8 -t UTF-16LE > file.out
' '{print $1}'

Ou seja, trate a entrada como um fluxo de bytes, mas defina os separadores de registro e campo como suas codificações UTF-16LE de dois bytes.

Agora, isso não funcionaria se a entrada contivesse coisas como:

LC_ALL=C awk -v RS='\n
<U+0AFF><U+FF00>
' -v ORS='\n
< file.in iconv -f UTF-16LE |
  awk -F'|' '{print $1}' |
  iconv -t UTF-16LE > file.out
' -F '[|]
< file.in iconv -f UTF-16LE -t UTF-8 |
  LC_ALL=C cut -d '|' -f1 |
  iconv -f UTF-8 -t UTF-16LE > file.out
' '{print $1}'

O qual seria codificado como FF0A00FF (portanto, contém o separador de registro \n| ).

A conversão para UTF-8 parece ser a única opção confiável. Você não precisa usar um arquivo temporário (supondo que o mapa de caracteres do locale seja UTF-8)

%pre%

Como nenhum outro caractere que não seja | em UTF-8 pode conter o byte para awk (0x7c) (mesmo para nova linha ou qualquer caractere no conjunto de caracteres portátil), você também pode otimizar usando a localidade C para cut ou até mesmo usar %code% :

%pre%     
por 20.01.2017 / 12:50