
O arquivo de origem possui um caractere especial no início de cada linha. O arquivo é delimitado por espaço duplo.
Arquivo de dados de amostra:
âNAME ABC
âAGE 21
âADDRESS XYZ street ABC city
âCONTACT 13244235
âDOJ 20181212
Quero remover â
o primeiro caractere especial de cada linha e converter o arquivo em ;
um arquivo delimitado por ponto e vírgula.
Escrevi o código abaixo que está funcionando bem no UAT, mas não está funcionando corretamente no PROD:
awk '{ print substr($0,1) }' FILE1.txt | sed 's/ /;/' > FILE2.txt
Saída UAT (saída desejável que é esperada):
NAME;ABC
AGE;21
ADDRESS;XYZ street ABC city
CONTACT;13244235
DOJ;20181212
Saída PROD:
âNAME;ABC
âAGE;21
âADDRESS;XYZ street ABC city
âCONTACT;13244235
âDOJ;20181212
O mesmo código está funcionando bem no UAT, ou seja, removendo o primeiro caractere e convertendo o arquivo em ;
delimitado por ponto e vírgula, mas no PROD não está removendo o primeiro caractere especial, mas convertendo o arquivo em delimitado por ponto e vírgula.
Saída de locale
:
locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Alguém pode me ajudar sobre isso ..?
Responder1
Eu acho que seu problema pode estar relacionado à codificação de caracteres, tente exibir o FILE1.txt
em ambos os ambientes com
hexdump -C FILE1.txt
Pode ser codificado como E-ascii ou UTF-8 (vejahttps://en.wikipedia.org/wiki/%C3%82#Character_mappings)
Para resolver seu problema, você pode tentar combinar as duas codificações:
â in UTF-8 â in other encoding
| |
v v
sed 's/\xc3\xa2//' FILE1.txt | sed 's/\xE2//' > FILE2.txt
Outra solução poderia ser converter seu arquivo para uma codificação conhecida antes de processá-lo.
Pode ser perigoso não testar a codificação PROD.
Responder2
Como o que â
você está vendo é quase certamente um problema de codificação, e assumindo que todas as suas linhas devem começar com uma letra maiúscula, você pode tentar o seguinte:
LC_ALL=C sed 's/^[^A-Z]*//; s/ */;/g' FILE1.txt > FILE2
Isso executará o comando usando o C
código do idioma, o que deve garantir que qualquer caractere que você â
esteja não esteja incluído no intervalo AZ. Em seguida, o comando sed simplesmente remove todos os caracteres que não estão no intervalo AZ do início de cada linha e, em seguida, converte todas as ocorrências de dois ou mais espaços em ;
.
Responder3
tentar
sed 's/^â//; s/ */;/g' FILE1.txt > FILE2.txt
E vote negativamente se não funcionar para você
Responder4
Para remover o primeiro caractere de cada linha, deve ser:
cut -c2- # not with the GNU implementation which is currently not multi-byte aware
sed 's/^.//'
awk '{print substr($0, 2)}' # note the 2 instead of 1 as offsets are 1-based
# not with mawk or other non-multi-byte aware awk
# implementations.
Tenha cuidado, entretanto, para .
corresponder a esse â
caractere e substr()
funcionar corretamente, ele â
deve ser codificado de acordo com a codificação do código do idioma (consulte a saída de locale charmap
).
Para remover o primeiro caractere e substituir todas as sequências de espaços em branco por ;
, você pode fazer:
sed 's/^.//;s/[[:space:]]\{1,\}/;/g'
Ou:
awk -v OFS=';' '{$0 = substr($0, 2); $1 = $1; print}'
(embora tenha cuidado, o último não incluirá um final ;
para linhas que terminam em caracteres em branco, e a lista de caracteres em branco considerados delimitadores varia de acordo com a awk
implementação e a localidade).
Agora, tome cuidado também, pois â
(U+00E2) é codificado como byte 0xe2 no conjunto de caracteres iso8859-1 (também conhecido como latin1
e alguns outros conjuntos de caracteres de byte único). E esse byte 0xe2 também é o primeiro byte da codificação de vários caracteres UTF-8 de 3 bytes, entre os quais vários caracteres de espaço em branco Unicode (como os caracteres de espaçamento U+2000 a U+200B).
Então, se você estiver vendo um â
exibido em um terminal latin1, pode ser que a entrada realmente contenha U+2002 (EN SPACE), por exemplo, codificado em UTF-8 (0xe2 0x80 0x82), e seu terminal exibiria isso 0xe2
como â
e não mostraria nada para 0x80 e 0x82 que não estão em latin1.
Para se livrar desse EN SPACE, você precisa remover 1 caractere em um código de idioma UTF-8 ou remover 3 caracteres em um código de idioma de byte único (como aquele que usa latin1 ou o código de idioma C).