2016-06-14 5 views
0

は私が必要なもの以前のコラムのマッチパターン

<block> 
6 3 0.3464400E-01 0.4497077E+03 0.7546771E-02 0.1037429E+00 
     21 -1 0 0 501 502 0.00000000000E+00 0.00000000000E+00 0.27717368685E+03 0.27717368685E+03 0.00000000000E+00 0. 1. 
</block> 

<block> 
4 1 0.3464400E-01 0.3573334E+03 0.7546771E-02 0.1068535E+00 
     6 1 1 2 501 0 -0.28596283579E+03 -0.12710688463E+03 0.60083326400E+02 0.36234949936E+03 0.17250000000E+03 0. -1. 
</block> 

のようなブロックを持っているとき」の後に最初の行だけで見ている、スペースで区切られた列内のN番目の列を交換してください「4 1」のパターンが真である場合にのみ、4番目の列を別の数に置き換えますが、他のすべての行はそのまま残ります。私はこのHow to replace the nth column/field in a comma-separated string using sed/awk?を見つけましたが、私のケースではあまり役に立ちませんでした(私の列はスペースで区切られています)。すでにこの可能性の重複の場合は、事前に申し訳ありませんが...私はあなたがこの変更したいと思います

答えて

1

:これまで

<block> 
4 1 0.3464400E-01 0.3573334E+03 

<block> 
4 1 0.3464400E-01 <something else> 

awkは、このための優れたツールです。ここにそれを行うための方法です:

awk '{ 
    if($1 == "<block>"){ 
    block_row=NR 
    } 
    else if(block_row>0 && NR == block_row+1 && $1 == 4 && $2 == 1){ 
    $4 = "<something>" 
    } 
    print $0 
}' infile > outfile 

mv -f outfile infile 
1

はあなたが交換するために利用可能な値を持っていると仮定すると、あなたは、上記の式では、単にawk

awk '/<block>/ { getline; if (($1=="4") && ($2=="1")) {$4=<value>;print} }' file 
#               ^Value to be replaced 

でこれを行うことができ、あなたが必要とする値で<value>を置き換えます。論理はかなり簡単です。第一及び第二の列の値が41をしている場合に予想されるよう確認し、それに次の行を取得し、パターンを検索し、ファイル以下のように持っていると仮定すると、列4

の値を置き換えます -

$ cat file 

<block> 
4 1 0.3464400E-01 0.3573334E+03 0.7546771E-02 0.1068535E+00 
6 1 1 2 501 0 -0.28596283579E+03 -0.12710688463E+03 0.60083326400E+02 0.36234949936E+03 0.17250000000E+03 0. -1. 
</block> 
<block> 
4 2 0.3464400E-01 0.3573334E+03 0.7546771E-02 0.1068535E+00 
6 1 1 2 501 0 -0.28596283579E+03 -0.12710688463E+03 0.60083326400E+02 0.36234949936E+03 0.17250000000E+03 0. -1. 
</block> 

0

$ awk '/<block>/ { getline; if (($1=="4") && ($2=="1")) {$4=0;print} }' file 
4 1 0.3464400E-01 0 0.7546771E-02 0.1068535E+00 
として置換値を使用してコマンドを実行しています