2014-01-22 105 views
1

改變,我有以下文件格式For循環和值用awk

... 
MODE P E 
IMP:P 1 19r 0 
IMP:E 1 19r 0 
... 
SDEF POS= 0 0 14.6 AXS= 0 0 1 EXT=d3 RAD= d4 cell=23 ERG=d1 PAR=2 
SI1 L 0.020 
SP1 1 
SI4 0. 3.401                  
SI3 0.9 
... 
NPS 20000000 

我所試圖做的是找到一個特定的值(特別是序列SI1 L後的值),並創建了一系列的具有不同值的文件。例如ST1 L 0.020 --->ST1 L 0.050。我想到的是給出一個起始值,一個結束值和一個步驟,以便在序列SI1 L之後生成具有不同值的文件。例如for循環可以工作,但我不知道如何在awk以外使用它。

我能夠找到使用

awk '$1=="SI1" {printf "%12s\n", $3}' file 

的價值,我也可以使用以下方法來代替值

awk '$1=="SI1" {gsub(/0.020/, "0.050"); printf "%12s\n", $3}' file 

的事情是,價值並不總是0.020。這就是爲什麼我需要在序列SI1 L之後替換該值的方法,並且應該爲許多值執行此替換。

這怎麼能達到?

+0

什麼應該是你想創建的文件的內容?與文件內容相關的開始和結束值如何? –

+0

@HåkonHægland:非常感謝您的評論!輸出文件將與輸入文件完全相同,除了序列「SI1 L」之後的不同值之外。 – Thanos

回答

1

你可以試試:

awk -vval="0.05" '$1=="SI1"{$3=val}1' file 

這將在輸入文件替換SI1 L 0.020通過SI1 L 0.05

然後用bash腳本調用awk程序在for循環中..

例如:

#! /bin/bash 

vals=(0.02 0.03 0.04 0.05) 

i=0 
for val in "${vals[@]}"; do 
    i=$(($i+1)) 
    awk -vval="$val" '$1=="SI1"{$3=val}1' file > "file${i}" 
done 
+0

非常感謝您的回答!如何生成輸出文件?我使用了'awk -vval =「$ val」'$ 1 ==「SI1」{$ 3 = val} 1'file> $ vals [@]'但它不起作用。 – Thanos

+0

@Thanos沒問題:)我已經用建議更新了我的答案..現在這些文件被命名爲'file1','file2',..等。 –

+0

最好我想輸出文件命名爲位置'i'處的值的名稱。例如輸出文件將是'0.02','0.03','0.04'等等。 – Thanos

1

如果您的系統具有SEQ命令,這裏是你更容易腳本。

for val in $(seq 0.02 0.01 0.05) 
do 
    awk -vval="$val" '/SI1 L/{$3=val}1' file > "${val}" 
    # or Using sed 
    # sed: sed "s/SI1 L .*/SI1 L $val/" > "${val}" 
done 
+0

非常感謝您的回答!我注意到你在'1'後面加了'/ SI1 L/{$ 3 = val} 1'。如果我刪除它,我沒有輸出。它有什麼作用? – Thanos

+0

1表示正確,所以它會打印該行。 – BMW

+0

非常感謝!還有一個問題? 「-vval」是做什麼的? – Thanos