如何提取账单文本首列、中间内容与末列并导出为CSV?
解决方案
方法一:用awk实现你要的分隔格式
直接运行以下awk命令,就能生成你期望的带|分隔的账单格式:
{ date = $1 sub(/^[^ ]+ /, "", $0) if ($NF == "Cr") { amount = $(NF-1) remark = $NF sub(/ [^ ]+ Cr$/, "", $0) } else { amount = $NF remark = "" sub(/ [^ ]+$/, "", $0) } printf("%s | %s | %s | %s\n", date, $0, amount, remark) }
执行方式:把代码保存为format_bill.awk,然后运行 awk -f format_bill.awk test.txt,或者直接用一行命令:
awk '{date=$1;sub(/^[^ ]+ /,"",$0);if($NF=="Cr"){amount=$(NF-1);remark=$NF;sub(/ [^ ]+ Cr$/,"",$0)}else{amount=$NF;remark="";sub(/ [^ ]+$/,"",$0)}printf("%s | %s | %s | %s\n",date,$0,amount,remark)}' test.txt
方法二:直接生成CSV格式(方便导入电子表格)
如果要导出为CSV,只需调整输出格式,给描述字段加引号(避免电子表格解析错误):
{ date = $1 sub(/^[^ ]+ /, "", $0) if ($NF == "Cr") { amount = $(NF-1) remark = $NF sub(/ [^ ]+ Cr$/, "", $0) } else { amount = $NF remark = "" sub(/ [^ ]+$/, "", $0) } printf("\"%s\",\"%s\",\"%s\",\"%s\"\n", date, $0, amount, remark) }
执行后将结果保存为CSV文件:
awk '{date=$1;sub(/^[^ ]+ /,"",$0);if($NF=="Cr"){amount=$(NF-1);remark=$NF;sub(/ [^ ]+ Cr$/,"",$0)}else{amount=$NF;remark="";sub(/ [^ ]+$/,"",$0)}printf("\"%s\",\"%s\",\"%s\",\"%s\"\n",date,$0,amount,remark)}' test.txt > bill.csv
补充:基于你已尝试的cut命令整合方案
如果你想用自己之前的cut命令实现,可以结合paste命令拼接各部分:
paste -d '|' \ <(cut -d ' ' -f1 test.txt) \ <(cut -d ' ' -f2- test.txt | rev | cut -d ' ' -f2- | rev) \ <(awk '{if ($NF == "Cr") print $(NF-1) "|Cr"; else print $NF "|"}' test.txt)
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

