在bash中替换/更新文本文档中的列值

时间:2016-11-27 19:38:22

标签: linux bash awk

我有一个问题,我如何在bash中更新文本文档中的行中的特定列值。  到目前为止我这样做: 在这种情况下,我正在尝试从特定帐号更新一行中的第4列。获取当前值,与用户插入的新值相加,然后将该当前值替换为结果。

使用两个变量打开脚本$ 1保存我要查找的帐户,而文件名为$ 2.

文本文档包含以下信息:

11101   :   CAJA GENERAL            :   111     :   0
11102   :   CAJA CHICA              :   111     :   0
112     :   BANCOS                  :   11      :   0
11201   :   CUENTAS CORRIENTES      :   112     :   0
1120101 :   Banco Agrícola S.A.     :   11201   :   20
1120102 :   Banco Hipotecario S.A.  :   11201   :   0
11202   :   CUENTAS DE AHORRO       :   112     :   0
1120201 :   Banco Agrícola S.A.     :   11202   :   0

我使用此代码查找正确的行并将当前值分配给var“act”并将其与另一个新值聚合

read -p "Inserte monto" insert
    act=$(grep -w "^$1" $2  | cut -d":" -f4)
    vare=$(($act + $insert))

但是我需要将这个新值放在我拿到原始值的确切列/行上。

我是如何做到的?在漫长的一天旅行中我已经筋疲力尽了,现在我想完成这个并去睡觉。任何人都可以给我一个想法或解决方案?我现在非常感谢任何帮助。

编辑: 好的..我去尝试AWK。 发现这是“替换”文本

awk -F':' -vOFS=' '  '{ $4 = "$vare"}1'

到目前为止......一旦我进入该行,脚本的执行就会停止..或者我不知道什么,但它不再继续,也没有显示任何错误。 我做错了吗?

编辑2: 预期投入。 成功更新后,我希望所选帐户在我的目录中的现有文档中具有更新的值,到目前为止,解决方案允许我查看终端内的更新,但原始文档是我需要查看更改的文档。感谢Ed Morton的提示

2 个答案:

答案 0 :(得分:0)

你可以用sed:

来做
id=$1
sed -i "/^$id *:/ s/[0-9]\+$/$vare/"  $2

答案 1 :(得分:0)

Maybe try awk:

$ cat file
11101   :   CAJA GENERAL            :   111     :   0
11102   :   CAJA CHICA              :   111     :   0
112     :   BANCOS                  :   11      :   1
11201   :   CUENTAS CORRIENTES      :   112     :   0
1120101 :   Banco Agrícola S.A.     :   11201   :   20
1120102 :   Banco Hipotecario S.A.  :   11201   :   0
11202   :   CUENTAS DE AHORRO       :   112     :   0
1120201 :   Banco Agrícola S.A.     :   11202   :   0

$ insert=10

$ ident=112

$ awk -i inplace -F: "/^$ident /{gsub(/([0-9]+)$/, \$4+ $insert)};{print}" file

-OR -

$ awk -i inplace -v ident="$ident" -v insert="$insert" '$1==ident{sub(/[0-9]+$/, $NF+insert)} 1' file

$ cat file
11101   :   CAJA GENERAL            :   111     :   0
11102   :   CAJA CHICA              :   111     :   0
112     :   BANCOS                  :   11      :   11
11201   :   CUENTAS CORRIENTES      :   112     :   0
1120101 :   Banco Agrícola S.A.     :   11201   :   20
1120102 :   Banco Hipotecario S.A.  :   11201   :   0
11202   :   CUENTAS DE AHORRO       :   112     :   0
1120201 :   Banco Agrícola S.A.     :   11202   :   0