Cómo convertir un archivo Unix de ancho fijo a tubería delimitada usando la posición ordinal de la columna y la longitud del campo

Cómo convertir un archivo Unix de ancho fijo a tubería delimitada usando la posición ordinal de la columna y la longitud del campo

Quiero convertir un archivo de ancho fijo en un archivo delimitado por tuberías en UNIX usando la posición ordinal de columna y la longitud del campo.

La entrada se ve así,

00100000003779U20210203
00200000004238U20210203

Salida requerida:

001|0000000377|9U|20210203
002|0000000423|8U|20210203

La información disponible es

Column Ordinal Position - field length 
1 - 3
2 - 10
3 - 2
4 - 8

Respuesta1

Esto puede ayudar:

cut -b1-3,4-13,14-15,16-23 --output-delim="|" file

Respuesta2

Con GNU awk

gawk -v OFS='|' -v FIELDWIDTHS="3 10 2 8" '{$1=$1; print}' file
001|0000000377|9U|20210203
002|0000000423|8U|20210203

El $1=$1truco obliga a awk a reescribir el registro utilizando el separador de campo de salida.


Si necesita algo más portátil, Perl es omnipresente:

perl -lne 'print join "|", (/^(.{3})(.{10})(.{2})(.{8})/)' file

información relacionada