我有一个问题,我如何在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的提示
答案 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