我想使用第一行(此处为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
答案 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
循环中。