суммирование содержимого текстового файла в другой с помощью awk - PullRequest
0 голосов
/ 14 мая 2018

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

маленький пример:

ENST00000054666.6   2
ENST00000054666.6_2 15
ENST00000054668.5   4
ENST00000054668.5_2 10
ENST00000054950.3   0
ENST00000054950.3_2 4

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

ENST00000054666.6   17
ENST00000054668.5   14
ENST00000054950.3   4

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

Я пробовал этот кодно не возвращает то, что я хочу:

awk -F '\t' '{ col2 = $2, $2=col2; print }' OFS='\t' input.txt > output.txt

знаете, как это исправить?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если заказ не является проблемой, ниже также может помочь:

awk -v FS="\t|_" '{count[$1]+=$NF}
                 END{for(i in count){printf "%s\t%s%s",i,count[i],ORS;}}' file
ENST00000054668.5   14
ENST00000054950.3   4
ENST00000054666.6   17

Редактировать: Если порядок вывода имеет значение, поможет следующий подход с использованием флага:

$ awk -v FS="\t|_" '{count[$1]+=$NF;++i;
                     if(i==2){printf "%s\t%s%s",$1,count[$1],ORS;i=0}}' file

ENST00000054666.6   17
ENST00000054668.5   14
ENST00000054950.3   4
0 голосов
/ 14 мая 2018

Решение 1-е: Следование awk может помочь вам в этом.

awk '{sub(/_.*/,"",$1)} {a[$1]+=$NF} END{for(i in a){print i,a[i]}}'   Input_file

Решение 2-е: Если ваш Input_file отсортирован по 1-му полю, вам могут помочь следующие.

awk '{sub(/_.*/,"",$1)} prev!=$1 && prev{print prev,val;val=""} {val+=$NF;prev=$1} END{if(val){print prev,val}}'  Input_file

Используйте > output.txt в конце вышеуказанных кодов, если вам нужен вывод в выходном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...