奇数行と偶数行の偶数と奇数の合計

奇数行と偶数行の偶数と奇数の合計

与えられたファイルの奇数行と偶数行の偶数と奇数の合計を提供するシェルスクリプトを作成したいと思います。

私は次を使いたいです:

sed -n 2~2p

そして

sed -n 1~2p

しかし、どこで、どのように解決を始めるべきかさえわかりません。私を正しい方向に案内してもらえますか?

入力ファイルの例:

20 15 14 17
20 50 79 77
55 40 89 77
45 65 87 12

出力例:

Odd summ: 15+17+55+89+77=253(Enough just the end of the summ)
Even summ: 20+50+12=82(Enough just the end of the summ)

答え1

ミラーの使用(https://github.com/johnkerl/miller)と実行

mlr --n2c put 'for (key, value in $*) {
    if ((value % 2 ==0) && (NR % 2 ==0)) {
      $even +=value;
    } elif ((value % 2 !=0) && (NR % 2 !=0)) {
      $odd +=value;
    }
  }
' then unsparsify then stats1 -a sum -f odd,even input.csv

あなたはやる

odd_sum,even_sum
253,82

答え2

そしてperl

perl -lne '$odd = $. & 1; $sum[$odd] += $_ for grep {($_ & 1) == $odd} /\d+/g;
           END {
             print "Sum of odd numbers on odd lines: " . (0+$sum[1]);
             print "Sum of even numbers on even lines: " . (0+$sum[0]);
           }' < file

(ここでは入力の10進数のシーケンスのみを考慮します。負の数または16進数、8進数も考慮する場合は調整する必要があります...)

入力例では、次のようになります。

Sum of odd numbers on odd lines: 253
Sum of even numbers on even lines: 82

完全な推定出力を得るには、次のようにします。

perl -MList::Util=sum -lne '
   $odd = $. & 1;
   push @{$l[$odd]}, grep {($_ & 1) == $odd} /\d+/g;
   END {
     $" = "+";
     print "Odd sum: @{$l[1]}=" . sum(@{$l[1]});
     print "Even sum: @{$l[0]}=" . sum(@{$l[0]});
   }' < file

あなたsed -n 2~2psed -n 1~2pはGNU拡張です。標準の等価項目は次のとおりです。sed 'n;d'sed '1d;n;d'

答え3

または奇数(行または値)+偶数(値または行)=奇数(テスト出力)のみがあるため...

awk '{
    for (i=1;i<=NF;i++)
        {if (($i+NR)%2==0) {if ($i%2==0) {
            seven+=$i; even=even "+" $i} else {sodd+=$i; odd=odd "+" $i} }
        }
    } END {
        print "Evens:", substr(even,2,length(even)-1) "=" seven;
        print "Odds:", substr(odd,2,length(odd)-1) "=" sodd;        
    }' file

出力

Evens: 20+50+12=82
Odds: 15+17+55+89+77=253

答え4

私たちはすべてを数学に変えることができます。ほとんどの言語では、またはvar%22つの値しか使用できません。これを数値として乗算できる場合は、次のようにできます(たとえば、awkで)。01

(f%2) * f

f(フィールド)の値が奇数の場合は奇数、0それ以外の場合は奇数です。
したがって、awkではこれで十分です。

awk '{ 
         for(f=1;f<=NF;f++){
             so +=  (NR%2) *  ($f%2) * $f;
             se += !(NR%2) * !($f%2) * $f
         }
     }END{
          print(so,se)
     }
    ' filetotest

どこにNRレコード番号があり、fフィールド番号がありますか?

関連情報