[交易金额]列上的某些输出结果不正确。这是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
这是脚本运行后的输出:
awk
脚本过滤掉前导-
和ALL'。从最后一列(金额)开始,带有
gsub(/^-|\./,"",$NF)
这将导致十进制数字按比例放大,并丢失符号。您可能要查看此命令,至少保留小数点。由于'd'格式,小数部分将由sprintf
命令删除。与“ C”程序不同,awk会根据需要转换任何数值(int,float)以匹配格式。
您能不能尝试以下操作。
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))
if($NF~/\./){
$NF=$NF"0"
}
gsub(/^-|\./,"",$NF)
$NF=sprintf("%012d",$NF)
$3=$3 $NF
print $1 s1 $2,$3
}
' Input_file
输出将如下。
Account number (preferred / formatted),Customer reference,Posting date,Account currency,Transaction amount
750-85665-3 0000233454 100119000001888810
750-85665-3 0000233464 100119000000873490
750-85665-3 0000233467 100219000000254770