在awk中添加失败

时间:2016-05-09 19:25:22

标签: shell math awk

我正在使用以下代码片段,我在awk中导出shell变量,如下所示:

  half_buffer1=$((start_buffer/2))
  half_buffer2=$((end_buffer/2))
  echo $line | awk -v left="$half_buffer1" -v right="$half_buffer2" 'BEGIN {print $1"\t"$2-left"\t"$3+right"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}'

然而对于变量'对'在awk中有时会减去$ 3变量而不是添加'权利'变量为3美元。

1 个答案:

答案 0 :(得分:3)

注意以下内容提供了“错误”答案:

$ echo 1 2 3 4 5 | awk -v left=10 -v right=20 'BEGIN {print $1"\t"$2-left"\t"$3+right"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}'
        -10     20

要获得正确答案,请移除BEGIN

$ echo 1 2 3 4 5 | awk -v left=10 -v right=20 '{print $1"\t"$2-left"\t"$3+right"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}'
1       -8      23      4       5

问题是BEGIN块在>读取任何输入之前执行。因此,变量$1$2等尚无有用的值。

如果删除了BEGIN,则会在读取的每一行上执行代码。这为您提供了所需的答案。

实施例

使用评论中的真实输入行:

$ echo ID1 14389398 14389507 109 + ABC 608 831 | awk -v left=10 -v right=20 '{print $1"\t"$2-left"\t"$3+right"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}'
ID1     14389388        14389527        109     +       ABC     608     831

$ echo  ID1 14390340 14390409 69 + ABC 831 32 –  | awk -v left=10 -v right=20 '{print $1"\t"$2-left"\t"$3+right"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}'
ID1     14390330        14390429        69      +       ABC     831     32

此外,这个shell脚本:

start_buffer=10
end_buffer=100
half_buffer1=$((start_buffer/2))
half_buffer2=$((end_buffer/2))
echo  ID1 14390340 14390409 69 + ABC 831 32 –  | awk -v left="$half_buffer1" -v right="$half_buffer2" '{print $1"\t"$2-left"\t"$3+right"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8}'

生成此输出:

ID1     14390335        14390459        69      +       ABC     831     32