我正在尝试使用bash脚本修改基于文本的财务分类帐中的特定记录。
交易的格式如下。每个之间都有一个空行。
2017-09-12 * Kroger Grocery
; UUID: a5d421aebeee0d976f8cfeabce3f8247
; Imported: 2017-09-12
Assets:Banks:Checking $ -100.00
Expenses:General $ 100.00
2017-09-12 * Another Payee
; UUID: 642c60861cdf8bc2ad96a9106112123e
; Imported: 2017-09-12
Assets:Banks:Checking $ -75.00
Expenses:General $ 75.00
到目前为止,我有一个bash脚本(使用awk),它根据一些输入文本在一组文件中定位事务,并在vim中打开一个临时文件,其中包含所有匹配的事务。
在进行更改并退出任何已修改的事务后(再次使用awk)并作为事务数组返回。
我现在需要在源文件中找到每个修改过的事务的原始文件(可能是由uuid字符串),并将其替换为修改后的事务。我不确定这样做的最好方法。 awk可以轻松处理吗?或者我应该寻找其他解决方案吗?
如果修改后的事务数组包含此事务,则使用我提供的示例事务作为小型源文件:
2017-09-12 * Another Payee
; UUID: 642c60861cdf8bc2ad96a9106112123e
; Imported: 2017-09-12
Assets:Banks:Checking $ -75.00
Expenses:Some:Other:Account $ 75.00
源文件现在应该是:
2017-09-12 * Kroger Grocery
; UUID: a5d421aebeee0d976f8cfeabce3f8247
; Imported: 2017-09-12
Assets:Banks:Checking $ -100.00
Expenses:General $ 100.00
2017-09-12 * Another Payee
; UUID: 642c60861cdf8bc2ad96a9106112123e
; Imported: 2017-09-12
Assets:Banks:Checking $ -75.00
Expenses:Some:Other:Account $ 75.00
答案 0 :(得分:3)
awk
救援!
$ awk -v RS= -v ORS='\n\n' -F'\n' 'NR==FNR {txn[$2]=$0; next}
$2 in txn {$0=txn[$2]}1' txn ledger
2017-09-12 * Kroger Grocery
; UUID: a5d421aebeee0d976f8cfeabce3f8247
; Imported: 2017-09-12
Assets:Banks:Checking $ -100.00
Expenses:General $ 100.00
2017-09-12 * Another Payee
; UUID: 642c60861cdf8bc2ad96a9106112123e
; Imported: 2017-09-12
; Update: 2017-09-12
Assets:Banks:Checking $ -95.00
Expenses:General $ 95.00
使用相同的分类帐文件和修改后的txn文件(插入更新行和修改后的金额)。
这假设您的记录始终包含与给定的相同位置和格式的UUID(该行用作密钥);任何新的交易都不会被添加(只有更新)。此外,文件末尾还会有一个额外的新行。