更改数字格式

更改数字格式

我有很多类似下面的行:

123;XXXXXXXXXXXXXXX;ABCDE;YYYYYYYY;08082010;000000000000000;03/08/10;110000;ZZZZZZZZZZZZZZZZZ;0002

我只想将数字格式(15 位数字) XXXXXXXXXXXXXXX 更改为 XXXXXXXXX;XXX;XXX

YYYYYYYYY(9 位数字)至 YYYYYY;YYY

使用 sed。

任何其他格式只需保留默认格式

答案1

假设“X”和“Y”代表数字,并且您的示例行实际上有 9 个“Y”数字(在您的问题中有 8 个,但您想要的分割显示 9),这应该有效:

sed 's/;\([0-9]\{6\}\)\([0-9]\{3\}\);/;\1;\2;/;s/;\([0-9]\{9\}\)\([0-9]\{3\}\)\([0-9]\{3\}\);/;\1;\2;\3;/'

您可以使用变量来使其更具可读性:

dig3="[0-9]\{3\}"
dig6="[0-9]\{6\}"
dig9="[0-9]\{9\}"
sed "s/;\($dig6\)\($dig3\);/;\1;\2;/;s/;\($dig9\)\($dig3\)\($dig3\);/;\1;\2;\3;/"

答案2

当您拥有结构化数据和字段分隔符时,使用 awk 会更容易。在您的数据中,您有“;”作为分隔符,因此请使用它。

awk -F";" '
{
  $2=substr($2,0,9)";"substr($2,9,3)";"substr($2,12,3)
  $4=substr($4,0,6)";"substr($4,7)
}{print}
' OFS=";" file

awk 语句表示使用“;”作为分隔符,然后对字段 2 和 4 ($2, $4) 进行操作以获得所需的输出。要更改格式,请使用子字符串。最后将输出字段分隔符重新设置为“;”。

这比使用 sed 中冗长混乱的正则表达式更清晰。

相关内容