![如何计算列中行之间的差异?](https://linux22.com/image/219147/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E5%88%97%E4%B8%AD%E8%A1%8C%E4%B9%8B%E9%97%B4%E7%9A%84%E5%B7%AE%E5%BC%82%EF%BC%9F.png)
如果我有以下输出。一列有 8 行:
1
2
3
4
5
6
7
8
我想要一个类似这样的输出。
1-3
2-4
3-5
4-6
5-7
6-8
实际上,我只想要这种差异的结果。
答案1
这可能就是您所要求的:
$ seq 8 | awk -v d=2 'NR>d{print a[(NR-d)%d] "-" $0} {a[NR%d]=$0}'
1-3
2-4
3-5
4-6
5-7
6-8
或者可能:
$ seq 8 | awk -v d=2 'NR>d{print a[(NR-d)%d] - $0} {a[NR%d]=$0}'
-2
-2
-2
-2
-2
-2
答案2
您可以使用带有循环的 awk 来计算差异:
awk '{a[NR]=$1} END {for(i=1;i<=NR-2;i++) print a[i]-a[i+2]}' data.txt
这个带引号的版本"-"
将输出结果,如下1-3
所示:
awk '{a[NR]=$1} END {for(i=1;i<=NR-2;i++) print a[i]"-"a[i+2]}' data.txt
答案3
使用乐(以前称为 Perl_6)
~$ raku -e ' my @a = lines(); my @b = @a[2..*]; .put for [Z-] @a, @b;' file
输入示例:
1
2
3
4
5
6
7
8
示例输出:
-2
-2
-2
-2
-2
-2
Raku 是 Perl 家族的一种编程语言。它最初被命名为“Perl6”,直到 2019 年,然后重新命名为“Raku”。您可以在 Raku 中找到一些高级操作员。以上,lines
均读入@a
数组。然后通过复制第一个数组@b
来创建数组@a[2..*]
无字体它的前两个元素。最后,put
使用 Raku 的[Z]
Z 缩减元运算符输出数据,该运算符采用列表(例如@a
和@b
)并逐一提取各个元素,然后将它们组合起来。在这种情况下,组合由[Z-]
包含减号的复合运算符指导。这告诉 Raku 从第一个元素中减去第二个元素。
要获得更有趣的数字列表,请尝试grep
从 1000 以内的整数列表中 ping 出素数。下面的裸[Z]
运算符显示了初始结果:
~$ raku -e ' my @a = grep &is-prime, ^1000; my @b = @a[2..*]; .say for [Z] @a[0..7], @b[0..7];'
(2 5)
(3 7)
(5 11)
(7 13)
(11 17)
(13 19)
(17 23)
(19 29)
现在,使用[Z-]
复合归约元运算符:
~$ raku -e ' my @a = grep &is-prime, ^1000; my @b = @a[2..*]; .say for [Z-] @a[0..7], @b[0..7];'
-3
-4
-6
-6
-6
-6
-6
-10
https://docs.raku.org/language/operators.html#Reduction_metaoperators
https://docs.raku.org/routine/is-prime.html
https://docs.raku.org/language.html
https://raku.org