使用 awk 删除管道分隔符文件中的前导零

使用 awk 删除管道分隔符文件中的前导零

我在管道分隔符中有源文件,需要删除前导零

初始文件:

010N00000001|20100111|20150112|PA|3|00001|41|+0000000100.00|+0000000000.00|+0000000000.00|022|R| |
010N00000001|20100115|20150115|PA|3|00001|41|-0000000050.00|+0000000000.00|+0000000000.00|022|R| |

所需输出:

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||

有人提供awk上面的语法吗?我有更多属性,只是想了解第 6 个和第 8 个源属性与对应的第 6 个和第 8 个输出属性值。

答案1

例如,如果file包含您的数据:

awk -F\| -v OFS=\| '{ $6  = sprintf( "%.0f",  $6  )
                      $8  = sprintf( "%.2f",  $8  )
                      $9  = sprintf( "%.0f",  $9  )
                      $10 = sprintf( "%.0f",  $10 )
                      print }' file

-F\|选项将(输入)字段分隔符设置为管道符号;-v OFS=\|对输出字段分隔符执行相同的操作。带有赋值的行只需使用 - 函数重新格式化相应的字段sprintf()(它返回printf()使用相同参数打印的内容),最后,使用 输出完整的重新格式化记录print

至于重新格式化sprintf(),您可以从许多中进行选择控制字母以及相关的修饰语。这些链接指向 GNU awk 文档,但大多数字符都非常通用。

答案2

尝试这个,

awk 'BEGIN{OFS=FS="|"}{$6=sprintf("%1.0f",$6);$8=sprintf("%3.2f",$8);$9=sprintf("%1.0f",$9);$10=sprintf("%1.0f",$10)}1;' tt.txt

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R| |
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R| |
  • %X,其中 X 是必需的数字。
  • .xf,其中 x 是必需的小数。

来源

答案3

numfmt来自 GNU Coreutils 包的 正在对此类任务有用 - 不幸的是,它似乎尚未接受多个--field,--format规范,并且显然不处理带有一元 的数字+。有一点争论:

$ sed 's/[+ ]//g' file | 
    numfmt -d'|' --field=8 --format='%.2f' | numfmt -d'|' --field=6,9,10 --format='%.0f'
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||

答案4

我尝试使用以下命令,它按照预期输出正常工作

k=`awk '{print NF}' example.txt | sort -nr| sed -n '1p'`

for ((j=1;j<=2;j++)); do for((i=1;i<=$k;i++)); do awk -F "| -v i="$i" -v j="$j"  'NR==j{print $i}' example.txt| sed "s/^[+-]//g"| sed "s/^0\{2,\}//g"| sed "s/^\..*/0/g"; done| tr "\n" "|"| sed 's/|$//g'| sed 's/^|//g'; done| sed -r "s/\s+/|\n/g"| sed "s/^|//g"

输出

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|50.00|0|0|022|R||

相关内容