如何从awk中的第(n + 3)行减去每个n?

时间:2017-04-05 14:45:56

标签: bash awk

我有4个列数据文件,大约有100行。我想从第(n + 3)行减去每一个n并在新列中打印值($ 5)。列数据没有每列的常规模式。

我的示例文件:

cat input
1   2   3   20
1   2   3   10
1   2   3   5
1   2   3   20
1   2   3   30
1   2   3   40
1   2   3    .
1   2   3    .
1   2   3    . (and so on)

输出应为:

1   2   3   20  0  #(20-20)
1   2   3   10  20  #(30-10)
1   2   3   5   35  #(40-5)
1   2   3   20  ?  #(. - 20)
1   2   3   30  ?  #(. - 30)
1   2   3   40  ?  #(. - 40)
1   2   3       .   
1   2   3       .   
1   2   3       . (and so on)   

我怎么能在awk中这样做? 谢谢

2 个答案:

答案 0 :(得分:1)

为此,我认为最简单的方法是两次阅读文件。第一次(NR==FNR块)我们将所有第4列值保存在由行号索引的数组中。第二次执行下一个块并使用所需的计算创建第5列(首先检查以确保我们不会通过文件的末尾)。

$ cat input
1   2   3   20
1   2   3   10
1   2   3   5
1   2   3   20
1   2   3   30
1   2   3   40

$ awk 'NR==FNR{a[NR]=$4; last=NR; next} {$5 = (FNR+3 <= last ? a[FNR+3] - $4 : "")}1' input input
1  2  3  20  0
1  2  3  10  20
1  2  3  5   35
1  2  3  20
1  2  3  30
1  2  3  40

答案 1 :(得分:0)

您可以使用tac + awk + tac

执行此操作
tac input |
awk '{a[NR]=$4} NR>3 { $5 = (a[NR-3] ~ /^[0-9]+$/ ? a[NR-3] - $4 : "?") } 1' |
tac | column -t

1  2  3  20  0
1  2  3  10  20
1  2  3  5   35
1  2  3  20  ?
1  2  3  30  ?
1  2  3  40  ?
1  2  3  .
1  2  3  .
1  2  3  .