首页 > 解决方案 > csv 文件的输出量格式不正确

问题描述

交易金额列的部分输出结果不正确。这是 csv 文件:

Account number (preferred / formatted),Customer reference,Posting date,Account currency,Transaction amount
750856653,233454,1/10/2019,USD,-1888.81
750856653,233464,1/10/2019,USD,-873.49
750856653,NONREF,1/10/2019,USD,2762.3
750856653,NONREF,2/10/2019,USD,-456.53
750856653,233467,2/10/2019,USD,-2547.7

这是我的 awk 脚本:

Account number (preferred / formatted),Customer reference,Posting date,Account currency,Transaction amount
750-85665-3      0000233454 100119000000188881
750-85665-3      0000233464 100119000000087349
750-85665-3      0000233467 100219000000025477

金额为美元,-2547.7 被重新格式化为 25477,这是不正确的,它应该是 254770。我希望每个小数点后有一个数字的金额最后都有一个零(0),这样它匹配登录系统时的支票金额。

awk -v s1="      " '
BEGIN{
   FS=","
}
FNR==1{
   print
   next
}
$2!~/NONREF/{
   $1=substr($1,1,3)"-"substr($1,4,5)"-"substr($1,length($1))
   $2=sprintf("%010d",$2)
   split($3,array,"/")
   $3=sprintf("%02d%02d%s",array[2],array[1],substr(array[3],3))
   gsub(/^-|\./,"",$NF)
   $NF=sprintf("%012d",$NF)
   $3=$3 $NF
   print $1 s1 $2,$3
}
'  Input_file

这是我运行脚本后的输出:

标签: linuxbashawk

解决方案


awk脚本过滤掉前导-和所有“。” 从最后一列(金额)与

 gsub(/^-|\./,"",$NF)

这将导致十进制数字按比例放大,并丢失符号。您可能想查看此命令,至少保留小数点。sprintf由于 'd' 格式,小数部分将被命令删除。与“C”程序不同,awk 将根据需要转换任何数值(int、float)以匹配格式。


推荐阅读