2017-04-05 78 views
-1

我有4列数据文件,大约有100行。我想从第(n + 3)行中减去第n个值,并在新列中打印这些值($ 5)。列数据对于每列不具有规则模式。如何从awk中的第(n + 3)行减去第n个?

我的示例文件:

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? 谢谢

+1

你现在在做最多? – 123

+0

我试过getline和数组,但我无法解决它。 – Radioactive

+0

显示你做了什么,人们可以帮助你。 – 123

回答

1

为此,我认为最简单的事情是通过文件两次通读。第一次(NR==FNR块)我们将所有第四列值保存在由行号索引的数组中。下一个块被执行第二遍,并创建一个具有所需计算的第五列(首先检查以确保我们不会传递文件末尾)。

$ 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 
+0

这有效......我认为FNR的想法是完美的。多谢兄弟。 – Radioactive

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 . 
相关问题