Сумма четных и нечетных чисел нечетных и четных строк

Вы не можете, но вместо этого вы можете создать символические ссылки на ваш каталог «foo», вот так:

./foo
./foo/root ->.
./root -> foo/.

Затем добавьте «root» в начало всех ваших гиперссылок. Теперь, если вы откроете свой документ из «.», «root» будет преобразован в «foo/.», а ваш «root/baz.txt» будет преобразован в «foo/./baz.txt». При открытии из самого «foo» тот же «root/baz.txt» будет преобразован в «./baz.txt», поскольку «root» указывает на «.».

1
06.11.2019, 16:06
4 ответа

с использованием Миллера(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
1
27.01.2020, 23:40

С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~2pи sed -n 1~2pявляются расширениями GNU. Стандартными эквивалентами будут соответственно:sed 'n;d'и sed '1d;n;d'.

1
27.01.2020, 23:40

Или, поскольку только нечетная (строка или значение )+ четное (значение или строка )= нечетное (тестовый вывод )...

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
0
27.01.2020, 23:40

Использование утилиты linux dc:

cat file |
dc -e "
  [q]sq
  [lO+dsO]sa
  [lE+dsE]sb
  [d2%1=a sz z0<o]so
  [d2%0=b sz z0<e]se
  [?z0=q lN1+sN lN2%1=o lN2%0=e cz0=?]s?
  zddsNsEsO
  l?x
  [Sum of evens=]n lEp
  [Sum of  odds=]n lOp
" 

Результаты:

Sum of evens=82
Sum of  odds=253
0
27.01.2020, 23:40

Теги

Похожие вопросы