首页 > 解决方案 > 如何在列匹配中制作 CSV 文件

问题描述

我有一个 awk 脚本,它读取文件广告打印输出,最后 3 列合并在一起,当脚本运行时,合并的列假设有 18 位,它不超过 18 位,应该用零填充以匹配所需的格式。

这是 awk 脚本读取的 CSV 文件:

Account number (preferred / formatted),Customer reference,Posting date,Account currency,Transaction amount
750856653,233420,3/9/2019,USD,-2092.99
750856653,233417,3/9/2019,USD,-2856.15
750856653,233426,3/9/2019,USD,-2392.25
750856653,233414,3/9/2019,USD,-1733.22
750856653,233424,3/9/2019,USD,-1850.31
750856653,233403,3/9/2019,USD,-1850.32
750856653,233413,3/9/2019,USD,-1439.58
750856653,233431,3/9/2019,USD,-186.66

这是脚本运行时我当前的输出:(最后一列应该有 18 位数字,但就像最后一列的前 3 行一样。)

750-85665-3 0000233446  09162019000000230644
750-85665-3 0000233435  09162019000000173321
750-85665-3 0000233442  09162019000000219319
750-85665-3 0000233443  0916201900000097416
750-85665-3 0000233429  0918201900000069263
750-85665-3 0000233447  092320190000006619
750-85665-3 0000233450  092320190000001461
750-85665-3 0000233451  0923201900000035631

我的代码:

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

这是我想要的最后一列的输出,所有 18 位数字都填充了零。

750-85665-3  0000219839 090519000000017170
750-85665-3  0000233423 090519000000087349
750-85665-3  0000233416 090619000000047765
750-85665-3  0000233425 090619000000129305
750-85665-3  0000233421 090919000000199722
750-85665-3  0000219838 091019000000026502
750-85665-3  0000233415 091019000000169140
750-85665-3  0000233419 091119000000099291
750-85665-3  0000233433 091319000000188880
750-85665-3  0000233438 091319000000296821
750-85665-3  0000233452 091619000000323724
750-85665-3  0000233441 091619000000190742
750-85665-3  0000233446 091619000000230644

编辑(由 Ravinder 撰写):这看起来对 CSV 文件输出的后续问题不正确,尽管 OP 仍需要添加示例以供所有用户理解目的,但考虑将其添加到此处。

标签: linuxbashawk

解决方案


编辑:根据 OP,要在第一列和第二列之间插入空格,请尝试以下操作。

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


看完OP的上一篇文章后,请您尝试关注。这将确保您的新第三列将有 18 位数字(日期为 8 位 + 最后一个字段中的 10 位数字包括零)。

awk '
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,$2,$3
}
'  Input_file

推荐阅读