如何计算列中行之间的差异?

如何计算列中行之间的差异?

如果我有以下输出。一列有 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

相关内容