2012-03-29 11 views
0

私は次のような入力ファイルを持っています。文字列を含む行の特定のレコードを、linuxのインプレース編集sedを使って別のファイルの番号に置き換える方法

R sfst  1000.0000                
$ new time step for mass scaled calculation 
R dt2ms -4.000E-7                
$ friction value for blank 
R mue  0.120000                
$ blankholder force 
R bhf  2.0000E+5                
$ simulation time 
R endtime 0.150000 

私はそれを読むことができますが、それを変更傾ける以下で「MUE」 を含む行に値を変更したいです。

awk ' /mue/ { print $3 } ' input.txt 

値は別のファイルfric.txtから取得されます。 fric.txtには、各行に1つの数字しか含まれていません。

fric.txtは

0.1234 
0.234 
0.0234 

のようなデータを持っています。 。

BLOCKQUOTE

最初のインスタンスのみを交換する必要があることに留意すべきであると形式、すなわち白間隔はcosntantを保つこと。

BLOCKQUOTE

誰もがSEDやAWKを使ってこれを行うに私を導くことはできますか?

+0

どちらの行ですか? 42行目のような既知の固定線ですか? –

+0

いいえ、それはmeuと行、どこにでもある可能性があります –

+0

いいえ、どの行のfric.txt? –

答えて

1

これは、のために働くかもしれませんあなた:

sed '/\<mue\>/!d;=;s/.* \([^ ]\+\).*/\1/;R fric.txt' input.txt | 
sed 'N;N;s|\n|s/|;s|\n|/|;s|$|/|;q' >temp.sed 
sed -i -f temp.sed input.txt 
+0

問題は、meuのすべてのインスタンスを置き換えて、最初のインスタンスで停止しないということです。これが問題です。 –

+0

最初の場合にのみ変更を提案してください。 –

+1

スクリプトを最初のインスタンスに短縮しても問題ありません。修正された解決策を参照してください。 – potong

2

次のコマンドを試してみてください。

$ awk '/mue/ && !seen {getline $3 <"fric.txt"; seen=1} 1' input.txt 
+0

この場合、ファイルをパイプして、入力ファイルに返す必要があります。 sed -iでも可能ですので、場所の編集が行われ、ファイルの名前を変更する必要はありませんか?それは動作しますが、それはエレガントになります。 –

+0

副作用:名前を変更する前にそれらをdiffすることができます。 – kev

+0

それは間隔を変え、ソフトウェアがフォーマットを認識し続けるようにフォーマットを保持したい。どうやってそれを教えてもらえますか? –

1

あなたはsedの中でのsedでそれを行うことができます(あなたがfric.txtからライン1を利用したいと仮定した場合):

sed -ir 's/(.*mue[ \t]+)[0-9.]+(.*)/\1'$(sed -n '1{p;q}' fric.txt)'\2/' input.txt 
+0

sed:-e expression#1、char 39: 's 'コマンドのRHSで無効な参照\ 2 –

+0

このようなエラーは発生しません。コマンドをコピー&ペーストしましたか? –

+0

はい、コンソールとスクリプトで直接操作します。同じエラーです。 –

関連する問題