다른 테이블의 섹션이 포함된 파일이 있습니다. 헤더 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*dN
8열의 다음 항목 으로 롤업됩니다 .
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
이 모든 것을 요약할 것이다