группировка и суммирование строк в большом текстовом файле с использованием awk - PullRequest
0 голосов
/ 13 декабря 2018

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

example:

chr11   314980  314981  63  IFITM1  -131
chr11   315025  315026  54  IFITM1  -86
chr5    315085  315086  118 AHRR    -53011
chr16   316087  316088  56  ITFG3   -86
chr16   316088  316089  90  ITFG3   -131
chr11   319672  319673  213 IFITM3  -131
chr11   319674  319675  514 IFITM3  -164

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

expected output:

-131    366
-86     110
-53011  118
-164    514

Я пытаюсь сделать это в awk, используя следующий код.

sort myfile.txt | awk -F'\t' '{ sub(/..$/,"**",$6) }1' OFS='\t' | awk '{print $1 "\t" $2}' > outfile.txt

но на самом деле он возвращает пустой файл.ты знаешь как это исправить?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Использовать ассоциативный массив:

awk '{a[$NF]+=$4}END{for (i in a){print i, a[i]}}' file
0 голосов
/ 13 декабря 2018

Если вы в порядке с отсортированным выводом, вам не нужны массивы:

sort -k6n file |
awk -F'\t' '
    grp != $6 {
        grp = $6
        printf "%s%s%s%s", sum, sep, grp, FS
        sum = 0
        sep = ORS
    } { sum += $4 } END { print sum }'
0 голосов
/ 13 декабря 2018

Понятия не имею, что вы думаете о своем коде: почему вы заменяете последние 2 символа в строке звездочками?почему ты не делаешь никаких дополнений?почему вы сортируете (по столбцу 1) сначала?

awk -F'\t' '
    {sum[$6] += $4} 
    END {for (key in sum) {print key, sum[key]}}
' file | column -t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...