固定幅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

関連情報