2016-11-27 71 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