지정된 헤더가 있는 열의 모든 값을 합산합니다.

지정된 헤더가 있는 열의 모든 값을 합산합니다.

다른 테이블의 섹션이 포함된 파일이 있습니다. 헤더 N*dN으로 각 열에 포함된 모든 값을 추가하고 싶습니다.

예를 들어:

omega (dN/dS) = 999.00000

dN & dS for each branch

 branch          t       N       S   dN/dS      dN      dS  N*dN  S*dS

  11..6      0.000   532.0   266.0 999.0000  0.0000  0.0000   3.0   0.0
  11..7      0.000   532.0   266.0 999.0000  0.0000  0.0000   4.0   0.0
  11..12     0.000   532.0   266.0 999.0000  0.0000  0.0000   0.5   0.0

omega (dN/dS) = 1.00000

dN & dS for each branch

 branch          t       N       S   dN/dS      dN      dS  N*dN  S*dS

  11..6      0.000   532.0   266.0 999.0000  0.0000  0.0000   7.0   0.0
  11..7      0.000   532.0   266.0 999.0000  0.0000  0.0000   2.0   0.0
  11..12     0.000   532.0   266.0 999.0000  0.0000  0.0000   0.4   0.0

원하는 출력:

7.5
9.4

어쩌면 약간의 수정

awk '{s+=$8}END{print s}'

거기에서 열 헤더를 지정하고 합계의 합계가 아닌 각 합계에 대해 별도의 결과를 인쇄하도록 할 수 있습니다.

답변1

이 방식으로 사용할 수 있습니다 awk(콘텐츠 뒤에는 항상 일치하는 헤더가 오고 모든 개수가 동일하며 그 사이에 빈 줄이 없다고 가정).

awk 'f{s+=$8;f++} ($8=="N*dN"){f=1} (f>4){print s;f=s=0}' infile

또는 일반적으로 다음과 같이 사용합니다. N*dN8열의 다음 항목 으로 롤업됩니다 .

awk 'f{s+=$8} (f &&$8=="N*dN"){print s;f=s=0} ($8=="N*dN"){f=1} END{print s}' infile

답변2

다른방법:

awk '$8=="N*dN"{ r=NR; if(s) print s; s=0 }r && NR-r<5{ s+=$8 }END{ print s }' file

산출:

7.5
9.4

답변3

글쎄요, 프로그래머의 관점에서는 그다지 흥미롭지는 않지만 정말 빠르고 간단한 작업에는 괜찮습니다.

보시다시피 모든 흥미로운 줄에는 문자열이 포함되어 있으므로 ..다음을 사용하여 필터링할 수 있습니다 grep.

grep -F '..' <input.txt|awk 'BEGIN{s=0}{s+=$8}END{print s}'

여러 열에 대해 이 작업을 수행하려면 여러 변수(예: $a, $b, $c, ...)를 사용해야 합니다.

답변4

다음과 같이 사용할 수 있습니다.

(awk '{if($8=="N*dN")next}{print 0$8}' data.txt | tr '\n' '+'; echo 0) | bc -l

{if($8=="N*dN")next}쓸모없는 헤더를 버리세요

{print 0$8}8번째 필드를 앞에 "0"으로 인쇄합니다(빈 필드는 0으로 대체됨).

tr '\n' '+'; echo 0줄 끝을 "+"와 후행 0으로 바꿉니다.

bc -l이 모든 것을 요약할 것이다

관련 정보