将变量添加到列条目awk

时间:2017-08-30 10:57:24

标签: awk

我想从读取到变量的文件中提供一个值,然后使用它来修改另一个文件中列的所有元素,特别是将条目移动一些数字。

数据文件“file_to_change”有两列数值数据,一列要移位。像这样:

-1.643465E+01    1.378835E-03
-1.642464E+01    1.242392E-03
-1.641463E+01    1.147501E-03
-1.640462E+01    1.083067E-03
-1.639461E+01    1.042069E-03
-1.638460E+01    1.020041E-03
-1.637459E+01    1.014211E-03

包含移位值的文件“tmp”就是这样:

-11.43465

我目前有以下代码:

file=tmp
var1=$(awk 'NR==1' $file)

echo $var1

awk '{print ($1 - $var1) " " $2}' file_to_change

echo $var1

我的结果是:

   -11.43465
   0 1.378835E-03
   0 1.242392E-03
   0 1.147501E-03
   0 1.083067E-03
   0 1.042069E-03
   0 1.020041E-03
   0 1.014211E-03
   -11.43465

我想这很简单,但我看不出错误在哪里!

2 个答案:

答案 0 :(得分:1)

如果我理解了,你想要减去文件中的值" tmp"从文件中的第1列" file_to_change",对吧?

一种方法是:

awk 'NR==FNR{val=$0; nextfile} {$1-=val; print}' tmp file_to_change

首先,我们从文件的第一行" tmp"中读取值。并跳到下一个文件。

对于" file_to_change"中的每一行从第1列中减去该值并打印生成的行。

结果如下:

-5 1.378835E-03
-4.98999 1.242392E-03
-4.97998 1.147501E-03
-4.96997 1.083067E-03
-4.95996 1.042069E-03
-4.94995 1.020041E-03
-4.93994 1.014211E-03

答案 1 :(得分:0)

正如其他人所提到的,你没有正确地将 shell 变量传递给awk。 awk主体周围的单引号阻止了shell变量扩展。如果你在awk主体周围使用双引号,那么shell将扩展 awk 变量“$ 1”和“$ 2”。

你可以这样做引用混乱:

awk '{print ($1 - '"$var1"') " " $2}' file_to_change

或更清洁

awk -v var="$var1" '{print ($1 - var) " " $2}' file_to_change

解释为什么在第一列中得到0:在awk中,未设置的变量被视为空字符串,或者,如果您在“数字上下文”中,则数字为零。您有$var1,其中未设置 awk 变量“var1”。 $是一种运算符,返回列号的值。因此$ 1是第一列的值,$ 2是第二列的值,等等。您可以在那里使用变量,因此x=14; print $x, $(x+1)打印第14列和第15列。由于var1变量未设置,因此表达式$1 - $var1变为$1 - $0(对于第一行):

"-1.643465E+01" - "-1.643465E+01    1.378835E-03"

当awk对字符串进行算术运算时,会删除第一个非数字字符和后续字符。为了证明:

$ awk 'BEGIN {print "10foo" - "7bar"}'
3
$ awk 'BEGIN {print "1e1foo" + "-700e-2bar"}'
3

所以,"-1.643465E+01" - "-1.643465E+01 1.378835E-03"
变为-1.643465E+01 - -1.643465E+01
因此0

这很容易复制:

$ seq 10 | paste - - | awk '{print $1 - $novar, $2}'
0 2
0 4
0 6
0 8
0 10