我在管道分隔符中有源文件,需要删除前导零
初始文件:
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||