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=$1
truque 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