Shell-Script

奇偶線的偶數和奇數之和

  • December 11, 2019

我想編寫一個 shell 腳本程序,它給出給定文件的奇數行和偶數行中偶數和奇數的總和。

我想使用:

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)

使用米勒(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

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

(此處僅考慮輸入中的十進制數字序列,如果您還想考慮負數或十六進制、八進制數,則可能需要進行調整…)

在您的範例輸入中,它給出:

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'

引用自:https://unix.stackexchange.com/questions/550676