使用awk修改文本文件中的记录

时间:2017-09-12 17:34:47

标签: bash awk

我正在尝试使用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

1 个答案:

答案 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(该行用作密钥);任何新的交易都不会被添加(只有更新)。此外,文件末尾还会有一个额外的新行。