linux - 如何在列匹配中制作 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 仍需要添加示例以供所有用户理解目的,但考虑将其添加到此处。
解决方案
编辑:根据 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
推荐阅读
- codeigniter-3 - 在codeginter中获取空白页
- list - Haskell 嵌套列表理解
- r - 如何将带有NA项目的lapply结果转换为R中的数据框?
- fabricjs - fabricjs 免费绘图敏感
- javascript - 如何使用 js 保存用户输入并在专门搜索时显示信息
- javascript - 重定向到浏览器刷新按钮上的不同页面单击
- android-studio - Android Studio 中的 Gradle Sync Now 是否有任何键盘快捷键?
- c - readelf 'Align' 列单元
- c# - 向表格单元格添加随机值Android
- python - 有没有办法读取文件夹中的 n 个文本文件并存储为 n str 变量?