変数

2017-12-13 8 views
1

私は次のような問題への解決策を見つけるために問題を抱えていますの値で特定の行と列を交換してください:私のテキストファイルの先頭には、この変数

XXXXX 
XXXXXX XXXXXXX 
X 
X 
X 
XX 
X 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 XXXXXXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 XXXXXXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 XXXXXXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 XXXXXXE+00 

のXのように見えます 乱数があります。そして、16行目(vimを16行目として表示)から始まるこのパターンは、ファイルの終わり(vimに従う行71)まで続きます。行は常にスペースバーで始まり、その後に数字が続き、2つの数字の間には2つのスペースバーがあります。 私は、例えばv = 1.50のような値を持つ変数vを持っています 16行目から71行目までのすべての行について、最後の列の最初の4つのXを変数vの値に置き換えたいと思います。まさに終わり(行の先頭にスペースが残っているはずです)でこのファイル:

XXXXX 
XXXXXX XXXXXXX 
X 
X 
X 
XX 
X 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 

私はawkを持つビットを試してみましたが、私はそれが数字の間にスペースを追加することに問題がなかった(1等が5 0。)私は正しい列と行(vimは "バイナリ"列)に貼り付けることができず、awkで正しい列を見つけることができませんでした。 どうすればいいですか?私はスクリプトを使用して多くのファイルのためにそれをやりたい ありがとうございました!ここ

+1

':%s/X \ {6} E + 00 $/1.50XXE + 00'は機能しません。それとも、変数を使用したいのですか? – DJMcMayhem

+0

こんにちは、はい、1.50は単なる例でした。私も多くのファイルを持っているので、各ファイルにvimを入力することはできず、各ファイルのbashスクリプトから自動的にそれをやりたい。そして、Xは無作為に異なる数字であることを忘れています。だから私は以前に何があったのか分かりません。 –

+0

*変数*があると言ったら、どういう意味ですか?シェル変数?いくつかのプログラム内の変数?そのデータ型は何ですか? –

答えて

3

sedはあなたの例では、代替

$ var="1.50"; sed -E '8,$s/ ....(\S+)$/ '"$var"'\1/' file 

XXXXX 
XXXXXX XXXXXXX 
X 
X 
X 
XX 
X 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 

良いかもしれない代替ラインはあなたの実際のデータに基づいてライン8の変更で始めます。

あなたは派生値として変数の長さを有することができるだけでなく

$ var="1.50"; len=${#var}; sed -E '8,$s/ .{'$len'}(\S+)$/ '$var'\1/' file 
+0

こんにちは、ありがとう、いいね! v = 1.50の変数を持っている場合は、 "sed -E '8、$ s /(.*)...(\ S +)$/\ 1 $ v \ 2 /'ファイル "代わりに? –

+0

更新されたバージョンを確認してください。スクリプトの中に$ vを挿入するには、一重引用符を二重引用符に変更する必要があります。 – karakfa

+0

ありがとう、それは私が欲しいものを正確に行います。もう2つのこと:-Eの代わりにsed -iを使ってファイルに変更を直接書き込もうとしましたが、これはうまくいかないようです。そしてファイルの名前が "adffa.d23-24_3334_ + 4.33_-3.42_-5555_1.50.pfadf"であれば、bashコマンドを使って1.50(またはファイルの最後の最後の4文字)を抽出して保存することができます変数に? –

2

だけ...シンプルさ、明瞭さ、堅牢性、移植性、拡張性などのためのawkを使用します。

awk -v v='1.50' 'BEGIN{FS=OFS=" "} NR>15{sub(/.{4}/,v,$NF)} 1' file 

あなたの投稿したサンプル入力で:

$ awk -v v='1.50' 'BEGIN{FS=OFS=" "} NR>7{sub(/.{4}/,v,$NF)} 1' file 
XXXXX 
XXXXXX XXXXXXX 
X 
X 
X 
XX 
X 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00 
XXXXXXE+00 XXXXXXEE+03 XXXXXXE+07 XXXXXXE+00 1.50XXE+00