我想从读取到变量的文件中提供一个值,然后使用它来修改另一个文件中列的所有元素,特别是将条目移动一些数字。
数据文件“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
我想这很简单,但我看不出错误在哪里!
答案 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