我正在尝试更改文件第2,3和4列中的数字。为此,我有以下脚本
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列?
添加:)我使用\ $ fraction而不是“\ $ fraction”但是它给了我错误“反斜杠不是最后一个字符在线”
答案 0 :(得分:3)
在单引号内,shell忽略美元,反斜杠,双引号,反向标记 - 只有单引号很有趣。因此,awk
脚本会错误地获取值。使用-v variable="$value"
将shell变量传递给脚本。为什么要打扰bc
? awk
可以很快乐地成倍增加。
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
答案 1 :(得分:0)
你不需要shell循环:
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,请在FNR==1{ARGIND++}
部分后添加BEGIN{...}
语句。