홀수행과 짝수행의 짝수와 홀수의 합

홀수행과 짝수행의 짝수와 홀수의 합

주어진 파일의 홀수 및 짝수 줄에 있는 짝수와 홀수의 합을 제공하는 쉘 스크립트를 작성하고 싶습니다.

나는 다음을 사용하고 싶다:

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%2두 가지 값만 사용할 수 있습니다 . 이를 숫자로 사용하여 곱할 수 있다면 다음과 같이 할 수 있습니다(예: 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필드 번호가 있습니까?

관련 정보