열 1에는 식별자 목록이 있고 열 2에는 해당 개수가 있습니다. 파일은 다음과 같습니다.
KDO65387 65
KDO65387 27
XP_006465447 971
XP_006482015 1207
XP_003630414 194
XP_002513282 500
XP_003630414 23
내가 원하는 것은 1열의 값이 연속된 행에서 일치하는 경우 2열의 값을 합산하는 것입니다. 출력은 다음과 같습니다.
KDO65387 92
XP_006465447 971
XP_006482015 1207
XP_003630414 217
XP_002513282 500
답변1
순서가 중요한 경우:
awk '!($1 in sum) {f[n++] = $1}
{sum[$1] += $2}
END {for (i = 0; i < n; i++) print f[i], sum[f[i]]}' < file
그렇지 않은 경우 다음과 같이 단순화할 수 있습니다.
awk '{sum[$1] += $2}
END {for (f in sum) print f, sum[f]}' < file
답변2
사용 datamash
:
datamash groupby 1 sum 2 <infile.txt
답변3
perl -lane '
exists $h{$F[0]} or push @h, $F[0];
$h{$F[0]} += $F[1];
END { print "$_\t$h{$_}" for @h; }
' yourfile
위의 코드는 키 입력이 발생한 순서대로 인쇄합니다. 배열은 키의 순서를 유지하는 반면, 해시는 각 키에 해당하는 합계를 유지합니다.