列の行間の差を計算する方法は?

列の行間の差を計算する方法は?

次の出力がある場合。列には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..*]フォントなし最初の2つの要素。最後に、データはリスト(たとえば、および)を取得し、個々の要素を1つずつ抽出し、結合するputRakuの[Z]Z縮小メタ演算子を使用して出力されます。この場合、マイナス記号を含む複合演算子によって組み合わせが案内されます。これはRakuに第1要素から第2要素を減算するように指示する。@a@b[Z-]


より興味深い数字のリストを表示するには、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/言語/operators.html#Reduction_metaoperators
https://docs.raku.org/routine/is-prime.html
https://docs.raku.org/言語.html
https://raku.org

関連情報