Como converter arquivo Unix de largura fixa em delimitado por tubulação usando posição ordinal da coluna e comprimento do campo

Como converter arquivo Unix de largura fixa em delimitado por tubulação usando posição ordinal da coluna e comprimento do campo

Desejo converter um arquivo de largura fixa em um arquivo delimitado por tubulação no UNIX usando a posição ordinal da coluna e o comprimento do campo.

A entrada é assim,

00100000003779U20210203
00200000004238U20210203

Saída necessária:

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

As informações disponíveis são

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

Responder1

Isso pode ajudar:

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

Responder2

Com GNU awk

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

O $1=$1truque força o awk a reescrever o registro usando o separador de campo de saída.


Se você precisar de algo mais portátil, o perl é onipresente:

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

informação relacionada