2016-11-27 16 views
0

bashのテキスト文書の行から特定の列の値を更新するにはどうすればよいですか? これまでのところ、私はこれを行います: この場合、特定の口座番号から行の4番目の列を更新しようとしています。現在の値を取って、ユーザーが挿入した新しい値と合計し、その現在の値を結果と置き換えます。bashのテキスト文書の列の値を置換/更新する

2つの変数$ 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「行動」への現在の値を割り当て、別の新しい価値

read -p "Inserte monto" insert 
    act=$(grep -w "^$1" $2 | cut -d":" -f4) 
    vare=$(($act + $insert)) 
でそれを集約するために、このコードを使用します。

テキストドキュメントは、このような情報を持っています

しかし、私は元の値を取った正確な列/行にこの新しい値を配置する必要があります。

正確にはどうすればよいですか?私は旅行の長い一日からかなり疲れています。そして今、私はこれを終えてベッドに行きたいです。誰でも私にアイデアや解決策を与えることができますか?私は本当に助けて頂ければ幸いです。

EDIT: オクラホマAWKに行きました。私は、スクリプトの実行が停止し、その行を入力してください。..または私は知っているけど、それはもう続かない、また任意のエラーを示していけたら、これまでのところ、テキスト

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

を「置き換え」には、この...見つかり 。 何か間違っていますか?

EDIT 2: 予想される入力。 更新が成功した後、選択したアカウントに、ディレクトリ内の既存のドキュメントに更新された値を持たせたいと考えています。これまでの解決策では端末内の更新を見ることができましたが、あなたがSEDでそれを行うことができ、先端

+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も参照してください。 $ 1 == ident {sub(/ [0-9] + $ /、$ NF + insert)} 'ファイル' –

+0

私はこれを見ますかなりうまくいく。しかし、...私が既存の文書でそれを試しても、何も起こりません。私の端末は変更を加えたデータを表示しますが、元の文書は元のままで変更されません。 –

+0

nvm、元のファイルの内容を一時的に転送し、それを元に戻して機能させました。あなたのすべての協力に感謝します! –

0

のおかげでエド・モートン:

id=$1 
sed -i "/^$id *:/ s/[0-9]\+$/$vare/" $2 
関連する問題