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

时间:2019-07-01 14:44:38

标签: bash cat

我想使用第一行(此处为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

2 个答案:

答案 0 :(得分:0)

这是您要做什么吗?

$ 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

或类似名称,但考虑到您发布的脚本,这似乎并不是您真正需要的。

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

答案 1 :(得分:0)

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

类似的东西:

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

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