2016-06-10 63 views
0

我試圖更改第2,3和4列中的數字。要做到這一點,我有以下腳本在awk和bash腳本中轉義

for i in 0.8 0.9 1 1.1 1.2; do 
original=10.9398135077 
fraction=`bc <<< "$i*$original"` 
convert=0.529177 
awk '{printf "%-2s %10.5f %10.5f %10.5f\n", $1, ($2*"\$fraction"*"\$convert"), ($3*"\$fraction"*"\$convert"), ($4*"\$fraction"*"\$convert")}' temp2_${i}.txt > coord_${i}.txt 
done 

和我temp2_0.8.txt看起來像以下:

Cu  -0.000000000 0.000000000 -0.000000000 
Cu  0.500000000 -0.000000000 0.500000000 
Cu  0.000000000 0.500000000 0.500000000 
Cu  0.500000000 0.500000000 0.000000000 
S  0.398420013 0.398420013 0.398420013 
S  0.898420013 0.398420013 0.101579987 
S  0.398420013 0.101579987 0.898420013 
S  0.101579987 0.898420013 0.398420013 
S  0.601579987 0.601579987 0.601579987 
S  0.898420013 0.101579987 0.601579987 
S  0.101579987 0.601579987 0.898420013 
S  0.601579987 0.898420013 0.101579987 

但如果我執行我的劇本,我得到這個消息:

awk: warning: escape sequence `\$' treated as plain `$' 

我在所有轉換後的文件中獲得0.00000。看來我沒有在awk中隱藏關鍵字....我怎樣才能用awk正確地將「分數」和「轉換」到列號2,3和4?

添加:)我用\ $分數,而不是「\ $分數」,但它給了我錯誤「反斜線不就行了最後一個字符」

+2

在單引號內部,shell忽略美元和反斜槓 - 只有單引號很有趣。 awk腳本因此得到錯誤的值。使用'-v variable =「$ value」'將shell變量傳遞給腳本。爲什麼要打擾'bc'? 'awk'可以相當愉快地繁殖。 –

+0

@JonathanLeffler謝謝你,-v作品〜!這比我想象的要簡單。我使用bc的原因是將bash腳本中的$ i值相乘,以便在腳本的不同部分使用它。但我認爲你的想法也很好:)謝謝 – exsonic01

回答

3

裏面單引號,shell忽略美元,反斜槓,雙引號, back-ticks - 只有單引號很有趣。因此,awk腳本的值錯誤。使用-v variable="$value"將shell變量傳遞給腳本。爲什麼要打擾bcawk可以相當愉快地繁殖。

original=10.9398135077 
convert=0.529177 
for i in 0.8 0.9 1 1.1 1.2 
do 
    awk -v org="$original" -v factor="$i" -v conv="$convert" \ 
     'BEGIN { multiplier = factor * original * convert } 
     { printf "%-2s %10.5f %10.5f %10.5f\n", $1, 
        ($2 * multiplier), 
        ($3 * multiplier), 
        ($4 * multiplier) }' temp2_${i}.txt > coord_${i}.txt 
done 
+0

非常感謝你〜! – exsonic01

0

你並不需要爲這個殼循環:

awk ' 
BEGIN { 
    original = 10.9398135077 
    convert = 0.529177 
    split("0.8 0.9 1 1.1 1.2", factors) 
    for (i in factors) { 
     ARGV[i] = "temp2_"i".txt" 
     outfiles[i] = "coord_"i".txt" 
     multipliers[i] = factors[i] * original * convert 
     ARGC++ 
    } 
} 
{ 
    printf "%-2s %10.5f %10.5f %10.5f\n", $1, 
     $2 * multipliers[ARGIND], 
     $3 * multipliers[ARGIND], 
     $4 * multipliers[ARGIND] > outfiles[ARGIND] 
} 
' 

如果你不使用GNU AWK那麼BEGIN{...}部分後添加FNR==1{ARGIND++}聲明。