Quiero eliminar el primer carácter de cada línea como especial y convertir el archivo a; archivo delimitado por punto y coma

Quiero eliminar el primer carácter de cada línea como especial y convertir el archivo a; archivo delimitado por punto y coma

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.txten 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 Cconfiguració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 awkimplementació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 latin1y 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 0xe2como â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).

información relacionada