сумма вывода из файла CSV не в правильном формате - PullRequest
0 голосов
/ 05 ноября 2019

Некоторые выходные данные в столбце Сумма транзакции неверны. Это 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

Это мой вывод после запуска сценария:

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Скрипт awk отфильтровывает ведущие - и ALL '.'из последнего столбца (сумма) с

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

, что приведет к увеличению десятичных чисел и потере знака. Возможно, вы захотите просмотреть эту команду, хотя бы сохранить десятичные дроби. Десятичная часть будет удалена командой sprintf из-за формата 'd'. В отличие от программ на «C», awk преобразует любое числовое значение (int, float) в соответствии с форматом.

1 голос
/ 05 ноября 2019

Не могли бы вы попробовать следующее.

awk -v s1="      " '
BEGIN{
 FS=","
}
{
  gsub(/\r/,"")
}
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~/\.[0-9]$/){
    $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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...