2015-07-12 6 views
4

Я пытаюсь использовать awk для разбора таблицы с разделителями табуляции - в первом столбце есть несколько повторяющихся записей, и мне нужно удалить повторяющиеся строки, которые имеют меньшую общую сумму из остальных 4 столбцов в таблице. Я могу легко удалить первый или второй ряд и суммировать столбцы, но у меня проблемы с объединением двух. Для моих целей не будет более двух дубликатов.Проблемы с объединением awk-скриптов

Пример файла: http://pastebin.com/u2GBnm2D

Желаемый выход в этом случае было бы удалить строки:

lmo0330 1  1  0  1 
lmo0506 7  21  2  10 

И держать две другие строки с тем же идентификатором гена в столбце. Окончательный разобран файл будет выглядеть следующим образом: http://pastebin.com/WgDkm5ui

Вот что я пытался (. Это не делает ничего Но первая часть удаляет второй дубликат, а вторая часть суммирует отсчеты):

awk 'BEGIN {!a[$1]++} {for(i=1;i<=NF;i++) t+=$i; print t; t=0}' 

Я попытался изменения 2-ой части сценария в лучший ответ этого вопроса: Removing lines containing a unique first field with awk?

awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile 

Но, к сожалению, я не очень понимаю, что происходит достаточно хорошо, чтобы заставить его работать. Может кто-нибудь мне помочь? Я думаю, что нужно заменить a[$1] > 1 части с [удалить (первым дублирует счетчик или второй счетчик дубликата в зависимости от того, который больше]

EDIT:.. Я также использую GNU Awk 3.1.7, если это имеет значение

+0

Ваш вопрос в порядке, но это ч чтобы понять, чего вы точно хотите. – peterh

+0

Я добавил ссылку на то, как будет выглядеть результат после синтаксического анализа, помогает ли это выяснить вопрос? – 1225

+0

Это ОЧЕНЬ старая версия gawk, вы должны ее обновить, поскольку вам не хватает очень полезной функциональности. –

ответ

3

Вы можете использовать эту команду: awk

awk 'NR == 1 { 
    print; 
    next 
} { 
    s = $2+$3+$4+$5 
} s >= sum[$1] { 
    sum[$1] = s; 
    if (!($1 in rows)) 
     a[++n] = $1; 
    rows[$1] = $0 
} END { 
    for(i=1; i<=n; i++) 
     print rows[a[i]] 
}' file | column -t 

Выход:

gene  SRR034450.out.rpkm_0 SRR034451.out.rpkm_0 SRR034452.out.rpkm_0 SRR034453.out.rpkm_0 
lmo0001 160     323     533     293 
lmo0002 135     317     504     306 
lmo0003 1      4      5      3 
lmo0004 35     59     58     48 
lmo0005 113     218     257     187 
lmo0006 279     519     653     539 
lmo0007 563     1053     1165     1069 
lmo0008 34     84     203     107 
lmo0009 13     45     90     49 
lmo0010 57     210     237     169 
lmo0011 65     224     247     179 
lmo0012 65     226     250     215 
lmo0013 342     500     738     682 
lmo0014 662     1032     1283     1311 
lmo0015 321     413     631     637 
lmo0016 175     253     273     325 
lmo0017 3      6      6      6 
lmo0018 33     38     46     45 
lmo0019 13     1      39     1 
lmo0020 3      12     28     15 
lmo0021 3      4      14     12 
lmo0022 2      3      5      1 
lmo0023 2      0      3      2 
lmo0024 1      0      2      6 
lmo0330 1      1      1      3 
lmo0506 151     232     60     204 
+2

Спасибо! Я запустил его завтра – 1225

+1

Никогда не видел отступы/форматирование совсем так - проблема с вырезанием/вставкой? –

+1

Welp ... Это не работает должным образом. Вот мой полный файл: http://pastebin.com/hPnBw8RU и выходной файл от запуска awk-скрипта: http://pastebin.com/6ghVFVDK ... как-то его удаление имен генов, которые не дублируются, и я не знаете, почему:/в этом примере всего 3 дубликата. – 1225

Смежные вопросы