2016-11-27 72 views
0

我收到了一个关于如何从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: 预期输入。 成功更新后,我希望所选帐户在我的目录中的现有文档中具有更新后的值,到目前为止,解决方案允许我在终端中查看更新,但是原始文档是我需要查看更改的那个文档。感谢埃德莫顿的小费

+0

我建议看看'awk'。 – Cyrus

+0

我认为你应该提供一个文件到你的awk行......它没有定义什么“awk” –

+0

[编辑]你的问题包括给定的输入的预期输出。 –

回答

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 

- 或 -

$ 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 
+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' –

+0

我看到这个工作得很好。但是......当我在现有文档上尝试时,没有任何反应。我的终端显示包含更改的数据,但原始文档保持不变并保持不变。 –

+0

nvm,我将原始文件的内容传输到了一个临时文件,然后将其移回并运行。感谢你的帮助! –

0

用sed可以做到这一点:

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