группировка и подведение итогов текстового файла в awk - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть текстовый файл, подобный этому примеру:

пример:

chr12   58146000    58146050    79  chr12   58145961    58146075    CDK4
chr12   58146050    58146075    81  chr12   58145961    58146075    CDK4
chr12   69082750    69082800    57  chr12   69082741    69082833    NUP107
chr12   99038450    99038479    81  chr12   99038300    99038479    IKBIP
chr12   104680862   104680887   512 chr12   104680862   104680887   TXNRD1
chr12   104682708   104682750   134 chr12   104682708   104682818   TXNRD1

Я хочу сгруппировать их на основе столбца 8 и суммировать значения столбца 4, которые принадлежат той же группеи результаты будут разделены табуляцией с двумя столбцами.первый столбец - это числа, которые делаются после суммирования (из 4-го столбца), а 2-й столбец - это имя группы (из 8-го столбца).Я попробовал следующий код, но он не возвращает то, что я хочу.Вы знаете, как это исправить?

cut -d'\t' -f 8 | sort | uniq -c | awk '{ print sum($4), $8 }' infile > outfile

вот ожидаемый результат:

ожидаемый результат:

160 CDK4
57  NUP107
81  IKBIP
646 TXNRD1

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Другой подход, использующий GNU datamash вместо awk:

$ datamash -s groupby 8 sum 4 < data.tsv | datamash reverse
160 CDK4
81  IKBIP
57  NUP107
646 TXNRD1

Это предполагает, что столбцы во входном файле также разделены табуляцией.Если это не так, добавьте -W к параметрам.

0 голосов
/ 06 февраля 2019

Другой подход с использованием perl

 perl -lane ' $kv{$F[7]}+=$F[3]; END { for(keys %kv) { print "$_\t$kv{$_}" }} '

с использованием заданных входов

$ cat elly.txt
chr12   58146000    58146050    79  chr12   58145961    58146075    CDK4
chr12   58146050    58146075    81  chr12   58145961    58146075    CDK4
chr12   69082750    69082800    57  chr12   69082741    69082833    NUP107
chr12   99038450    99038479    81  chr12   99038300    99038479    IKBIP
chr12   104680862   104680887   512 chr12   104680862   104680887   TXNRD1
chr12   104682708   104682750   134 chr12   104682708   104682818   TXNRD1

$ perl -lane ' $kv{$F[7]}+=$F[3]; END { for(keys %kv) { print "$_\t$kv{$_}" }} ' elly.txt
NUP107  57
TXNRD1  646
IKBIP   81
CDK4    160

$
0 голосов
/ 06 февраля 2019
$ awk -v OFS='\t' '{sum[$8]+=$4} END{for (grp in sum) print sum[grp], grp}' file
81      IKBIP
57      NUP107
646     TXNRD1
160     CDK4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...