从第一行使用变量时向后读取文件

Reading file backward while using variable from first line

我想在使用第一行中存在的变量(此处: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  | awk 'NR==1 {nb=} NR>1 {up=nb-; print ,up,}'

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

tac  | awk 'NR==END {nb=} NR<END {up=nb-; print ,up,}'

我想要输出:

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

这是你想要做的吗?

$ awk 'NR==1{nb=; next} {print , nb-, }' 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 , nb-, }'
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([=12=],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

或类似内容,但考虑到您发布的脚本,这似乎不太可能是您真正需要的。

如果以上没有回答您的问题,请编辑您的问题以阐明您的要求,并根据您发布的样本输入提供预期的输出。

您可以拆分并重新合并文件的两个部分吗?

类似于:

cat <(head "") <(tail +2 ""| tac)  

但您最好对变量执行 head "" 命令,然后将 tail +2 ""| tac 单独执行到 read 循环中。