将变量添加到列条目awk

将变量添加到列条目awk,awk,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.6384

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

数据文件“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

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

如果我理解了,您想从文件“file_to_change”的第1列中减去文件“tmp”中的值,对吗

一种方法是:

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

正如其他人提到的,您没有正确地将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;打印$x,$(x+1)
打印第14列和第15列。由于变量
var1
未设置,表达式
$1-$var1
变为
$1-$0
,变为(第一行):

当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

在awk中不能像那样使用shell变量(
$var1
)。您需要给awk变量赋值,比如:
awk-v var1=“$var1”{…var1…
您可以像这样从shell向awk传递变量:
awk-v'var1=value'{print($1-$var1)”“$2}”文件\u to_change
(在awk中,您将变量称为var1,而不是$var1)请注意,
nextfile
是特定于GNU的,awkI会将您的代码编写为:
awk-v var=“$(
$ seq 10 | paste - - | awk '{print $1 - $novar, $2}'
0 2
0 4
0 6
0 8
0 10