如何在hledger日记账文本文件中右对齐金额
如何将账本文件中的金额右对齐到指定列?
需求:调整账本文件里金额(如123.00 EUR)前的空格,让金额右对齐到第53列。
原始文件内容
# 2018 ; A comment * Transactions 2018-01-01 @Payee | Internet expenses:communication:internet 123.00 EUR assets:cash:eur 2018-01-01 @Landlady | Rent expenses:housing:rent 321.00 EUR expenses:fees 2.50 EUR ; Bank fee assets:bank:eur
期望输出
# 2018 ; A comment * Transactions 2018-01-01 @Payee | Internet expenses:communication:internet 123.00 EUR assets:cash:eur 2018-01-01 @Landlord | Rent expenses:housing:rent 321.00 EUR expenses:fees 2.50 EUR ; Bank fee assets:bank:eur
解决方案:使用awk实现
可以用awk脚本识别包含金额的行,计算需要补充的空格数,重新格式化输出:
awk -v target_col=53 ' /[0-9]+\.[0-9]+ [A-Z]+/ { # 拆分账户部分和金额及后续内容 split($0, parts, /[ ]+([0-9]+\.[0-9]+ [A-Z]+)/) account = parts[1] rest = substr($0, length(account)+1) # 计算填充空格数,让金额起始位置对齐到目标列 pad = target_col - length(account) - length(rest) + length(match(rest, /[0-9]+\.[0-9]+ [A-Z]+/)) if (pad > 0) { printf "%s%*s%s\n", account, pad, "", rest next } } # 不匹配金额的行直接输出 {print} ' input.txt > output.txt
脚本说明
-v target_col=53:指定金额要右对齐到的目标列(此处为第53列)- 正则
/[0-9]+\.[0-9]+ [A-Z]+/匹配包含标准金额格式的行 - 拆分账户文本与金额及后续内容,计算需要补充的空格数量
- 通过
printf格式化输出,补充空格让金额对齐到目标列 - 不包含金额的行保持原样输出
注意事项
- 仅匹配
数字.数字 大写货币代码格式的金额行 - 若账户文本+金额的总长度已超过目标列,将保留原格式不调整
- 执行后结果会写入
output.txt,操作前建议备份原文件
内容的提问来源于stack exchange,提问作者Leeroy
相关产品推荐
相关产品推荐

