
El archivo fuente tiene un carácter especial al comienzo de cada fila. El archivo está delimitado por doble espacio.
Archivo de datos de muestra:
âNAME ABC
âAGE 21
âADDRESS XYZ street ABC city
âCONTACT 13244235
âDOJ 20181212
Quiero eliminar â
su primer carácter especial en cada línea y convertir el archivo en ;
un archivo delimitado (punto y coma).
He escrito el siguiente código que funciona bien en UAT pero no funciona correctamente en PROD:
awk '{ print substr($0,1) }' FILE1.txt | sed 's/ /;/' > FILE2.txt
Salida UAT (salida deseable que se espera):
NAME;ABC
AGE;21
ADDRESS;XYZ street ABC city
CONTACT;13244235
DOJ;20181212
Salida PROD:
âNAME;ABC
âAGE;21
âADDRESS;XYZ street ABC city
âCONTACT;13244235
âDOJ;20181212
El mismo código funciona bien en UAT, es decir, elimina el primer carácter y convierte el archivo a ;
delimitado por punto y coma, pero en PROD no elimina el primer carácter especial sino que convierte el archivo a delimitado por punto y coma.
Salida 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=
Puede alguien ayudarme con esto ..?
Respuesta1
Creo que su problema podría ser un enlace a la codificación de caracteres, intente mostrar FILE1.txt
en ambos entornos con
hexdump -C FILE1.txt
Puede codificarse como E-ascii o UTF-8 (consultehttps://en.wikipedia.org/wiki/%C3%82#Character_mappings)
Para resolver su problema, puede intentar hacer coincidir ambas codificaciones:
â in UTF-8 â in other encoding
| |
v v
sed 's/\xc3\xa2//' FILE1.txt | sed 's/\xE2//' > FILE2.txt
Otra solución podría ser convertir su archivo a una codificación conocida antes de procesarlo.
Puede resultar peligroso no probar la codificación PROD.
Respuesta2
Dado que lo que â
estás viendo es casi seguro que se trata de un problema de codificación, y suponiendo que todas tus líneas deben comenzar con una letra mayúscula, puedes probar esto:
LC_ALL=C sed 's/^[^A-Z]*//; s/ */;/g' FILE1.txt > FILE2
Eso ejecutará el comando usando la C
configuración regional, lo que debería garantizar que cualquier carácter que â
sea no esté incluido en el rango AZ. Luego, el comando sed simplemente elimina todos los caracteres que no están en el rango AZ del principio de cada línea y luego convierte todas las apariciones de dos o más espacios a ;
.
Respuesta3
intentar
sed 's/^â//; s/ */;/g' FILE1.txt > FILE2.txt
Y vota negativo si no te funciona.
Respuesta4
Para eliminar el primer carácter de cada línea, debería 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.
Sin embargo, tenga en cuenta que para .
que coincida con ese â
carácter y substr()
funcione correctamente, â
debe codificarse según la codificación local (consulte el resultado de locale charmap
).
Para eliminar el primer carácter y reemplazar todas las secuencias de espacios en blanco con ;
, puede hacer lo siguiente:
sed 's/^.//;s/[[:space:]]\{1,\}/;/g'
O:
awk -v OFS=';' '{$0 = substr($0, 2); $1 = $1; print}'
(aunque tenga cuidado, este último no incluirá un final ;
para las líneas que terminan en caracteres en blanco, y la lista de caracteres en blanco que se consideran delimitadores varía según la awk
implementación y la configuración regional).
Ahora, también tenga en cuenta que â
(U+00E2) está codificado como byte 0xe2 en el conjunto de caracteres iso8859-1 (también conocido como latin1
y algunos otros conjuntos de caracteres de un solo byte). Y ese byte 0xe2 también resulta ser el primer byte de la codificación de una cantidad de caracteres UTF-8 de 3 bytes, entre los cuales se encuentran varios caracteres de espacio en blanco Unicode (como los caracteres de espaciado U+2000 a U+200B).
Entonces, si ve un â
mensaje en una terminal latin1, podría ser que la entrada en realidad contenga U+2002 (EN ESPACIO), por ejemplo, codificado en UTF-8 (0xe2 0x80 0x82), y su terminal lo mostraría 0xe2
como â
y no mostraría nada para 0x80 y 0x82 que no están en latin1.
Para deshacerse de ese ESPACIO EN, necesitaría eliminar 1 carácter en una configuración regional UTF-8, o eliminar 3 caracteres en una configuración regional de un solo byte (como una que use latin1 o la configuración regional C).