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% :