在awk和bash脚本中转义

在awk和bash脚本中转义,bash,awk,escaping,Bash,Awk,Escaping,我正在尝试更改文件第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

我正在尝试更改文件第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
但如果我执行脚本,我会收到以下消息:

awk: warning: escape sequence `\$' treated as plain `$'
我所有转换的文件都有0.00000。似乎我没能在awk中转义关键字。。。。如何正确地将“分数”和“转换”与awk相乘到列号2、3和4


添加:)我使用了\$fraction而不是“\$fraction”,但它给了我错误“反斜杠不是行上的最后一个字符”

在单引号内,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

在单引号内,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

对于以下内容,您不需要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,那么在
BEGIN{…}
部分之后添加
FNR==1{argid++}
语句。

您不需要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,那么在
BEGIN{…}
部分之后添加
FNR==1{argid++}
语句。

在单引号内,shell忽略美元和反斜杠-只有单引号才有趣。因此,
awk
脚本获取的值错误。使用
-v variable=“$value”
将shell变量传递给脚本。为什么要费心于卑诗省的
bc
awk
可以非常愉快地繁殖。@JonathanLeffler哇,谢谢,-v工作~!这比我想象的要简单得多。我使用bc的原因是将bash脚本中的$I值相乘,以便在脚本的不同部分使用它。但是我认为你的想法也很好:)谢谢单引号,shell忽略了美元和反斜杠——只有单引号才有趣。因此,
awk
脚本获取的值错误。使用
-v variable=“$value”
将shell变量传递给脚本。为什么要费心于卑诗省的
bc
awk
可以非常愉快地繁殖。@JonathanLeffler哇,谢谢,-v工作~!这比我想象的要简单得多。我使用bc的原因是将bash脚本中的$I值相乘,以便在脚本的不同部分使用它。但我认为你的想法也很好:)非常感谢~!非常感谢~!