从bash中的文本文档中替换/更新列值
我收到了一个关于如何从bash中的文本文档中的行更新特定列值的问题。 到目前为止,我这样做: 在这种情况下,我试图从一个特定的帐户号码更新行中的第4列。取当前值,与用户插入的新值相加,然后用结果替换当前值。从bash中的文本文档中替换/更新列值
用两个变量$ 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
我使用此代码来找到正确的行和分配电流值到变量“行为”,并与其他新的价值
read -p "Inserte monto" insert
act=$(grep -w "^$1" $2 | cut -d":" -f4)
vare=$(($act + $insert))
总IT
但是,然后我需要把这个新的值,以确切的列/行我拿了原来的价值。
我该如何做到这一点?我从一天的旅行中精疲力尽,现在我想完成这个并且去睡觉。任何人都可以给我一个想法或解决方案?我非常感谢现在的任何帮助。
编辑: 好..我去,并尝试AWK。 发现这“替换为”文本
awk -F':' -vOFS=' ' '{ $4 = "$vare"}1'
到目前为止......一旦我进入这一行的脚本执行停止..或者我不知道是什么,但它不会继续下去了,也没有显示任何错误。 我做错了什么?编辑2: 预期输入。 成功更新后,我希望所选帐户在我的目录中的现有文档中具有更新后的值,到目前为止,解决方案允许我在终端中查看更新,但是原始文档是我需要查看更改的那个文档。感谢埃德莫顿的小费
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
- 或 -
$ 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
切勿将脚本用双引号括起来,始终单个。另见http://cfajohnson.com/shell/cus-faq-2.html#Q24。 'awk -v ident =“$ ident”-v insert =“$ insert”'$ 1 == ident {sub(/ [0-9] + $ /,$ NF + insert)} 1'file' –
我看到这个工作得很好。但是......当我在现有文档上尝试时,没有任何反应。我的终端显示包含更改的数据,但原始文档保持不变并保持不变。 –
nvm,我将原始文件的内容传输到了一个临时文件,然后将其移回并运行。感谢你的帮助! –
用sed可以做到这一点:
id=$1
sed -i "/^$id *:/ s/[0-9]\+$/$vare/" $2
我建议看看'awk'。 – Cyrus
我认为你应该提供一个文件到你的awk行......它没有定义什么“awk” –
[编辑]你的问题包括给定的输入的预期输出。 –