Как преобразовать файл Unix фиксированной ширины в файл с разделителями-трубами, используя порядковый номер столбца и длину поля

Как преобразовать файл Unix фиксированной ширины в файл с разделителями-трубами, используя порядковый номер столбца и длину поля

Я хочу преобразовать файл фиксированной ширины в файл с разделителями-конвейерами в UNIX, используя порядковый номер столбца и длину поля.

Вход выглядит так,

00100000003779U20210203
00200000004238U20210203

Требуемый результат:

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

Доступная информация

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

решение1

Это может помочь:

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

решение2

С GNU awk

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

Этот $1=$1трюк заставляет awk перезаписывать запись, используя разделитель выходных полей.


Если вам нужно что-то более переносимое, Perl вездесущ:

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

Связанный контент