我的数据文件如下所示:
10 -0.314690785295
20 -0.251967909317
30 -0.215271387106
40 -0.189228416217
所需的输出是:
10 -0.0627229
20 -0.0994193
30 -0.1254623
awk 'BEGIN {first_row = 0; col_val=""}{ if (first_row == 0) {first_row = $2; col_val=$1} else {print col_val " " first_row - $2; col_val=$1}}'
这是命令行的输出:
$ echo "10 -0.314690785295
20 -0.251967909317
30 -0.215271387106
40 -0.189228416217" | awk 'BEGIN {first_row = 0; col_val=""}{ if (first_row == 0) {first_row = $2; col_val=$1} else {print col_val " " first_row - $2; col_val=$1}}'
10 -0.0627229
20 -0.0994194
30 -0.125462
现在,确定其工作原理:
BEGIN子句定义一段代码,该代码段在启动之前作为初始化执行。在此位置,我们初始化两个变量,其余逻辑将跟踪这些变量。
在程序的主要部分中,在第二组{}中。我们定义了将对输入中的每一行执行的逻辑(您也可以在模式之前添加一个模式,使其仅在某些行上运行,但这不在此答案的范围之内)。
逻辑测试是否设置了first_row值。如果不是,则这是输入的第一行,我们只需要将first_row值初始化为该行中的第二个字符串,即$ 2,我们还需要复制第一列中的字符串$ 1为了匹配您所需的输出,我们将该值复制到col_val中。
否则,它是输入中的每隔一行,我们将col_value打印一个空格,并将first_row的结果与第二行$ 2的当前行的值相减,以便first_row-$ 2。然后,将输入的第一列中的新字符串值复制到col_val中。
我不明白您第一次真正需要什么:) ..这是可以执行您想要的操作的awk脚本..因为10-20是-10而不是10。
awk '{ if (NR == 1) { for (i = 1; i <= NF; i++){ first_row[i] = $i} } else { for (i = 1; i <= NF; i++){ printf "%s ", first_row[i] - $i }; printf "\n"}}'
请注意,输出看起来像这样,这与您为第一列添加的另一列以显示进度的预期期望稍有不同。
echo "10 -0.314690785295 18
20 -0.251967909317 12
30 -0.215271387106 35
40 -0.189228416217 44" | awk '{ if (NR == 1) { for (i = 1; i <= NF; i++){first_row[i] = $i} } else { for (i = 1; i <= NF; i++){ printf "%s ", first_row[i] - $i }; printf "\n"}}'
-10 -0.0627229 6
-20 -0.0994194 -17
-30 -0.125462 -26
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句