首页 > 解决方案 > 从第一行使用变量时向后读取文件

问题描述

我想在使用第一行中存在的变量时向后读取文件(此处:2636)。

我的文件:

nx_ 2355 ny_ 2636
0.000000 0.000000 0.000000
1.000000 68.000000 0.428139
2.000000 68.000000 0.939878
3.000000 67.000000 0.757181
4.000000 68.000000 0.000000
5.000000 69.000000 -1.229728

为了向前读取文件并处理它,我使用了:

cat $1 | awk 'NR==1 {nb=$4} NR>1 {up=nb-$1; print $2,up,$3}'

要向后读取文件,我似乎应该使用 tac,但我不知道如何在第一行检索变量,并避免处理最后一行。我正在寻找这样的东西:

tac $1 | awk 'NR==END {nb=$4} NR<END {up=nb-$1; print $2,up,$3}'

我想要作为输出:

69.000000 2631 -1.229728
68.000000 2632 0.000000
67.000000 2633 0.757181
68.000000 2634 0.939878
68.000000 2635 0.428139
0.000000 2636 0.000000

标签: bashcat

解决方案


这是你想要做的吗?

$ awk 'NR==1{nb=$4; next} {print $2, nb-$1, $3}' file | tac
69.000000 2631 -1.229728
68.000000 2632 0.000000
67.000000 2633 0.757181
68.000000 2634 0.939878
68.000000 2635 0.428139
0.000000 2636 0.000000

如果你真的必须做你说你想做的事,那就是这样:

$ read -r _ _ _ nb < file; tail +2 file | tac | awk -v nb="$nb" '{print $2, nb-$1, $3}'
69.000000 2631 -1.229728
68.000000 2632 0.000000
67.000000 2633 0.757181
68.000000 2634 0.939878
68.000000 2635 0.428139
0.000000 2636 0.000000

或这个:

$ read -r _ _ _ nb < file; tac file | awk -v nb="$nb" 'NR>1{print p[2], nb-p[1], p[3]} {split($0,p)}'
69.000000 2631 -1.229728
68.000000 2632 0.000000
67.000000 2633 0.757181
68.000000 2634 0.939878
68.000000 2635 0.428139
0.000000 2636 0.000000

或类似的,但鉴于您发布的脚本,这似乎不太可能是您真正需要的。

如果以上内容不能回答您的问题,请编辑您的问题以阐明您的要求并根据您发布的示例输入提供预期的输出。


推荐阅读