2015-09-25 3 views
0

У меня есть большой файл с 7 столбцов, Я хотел бы сравнить 2 колонки, Col 1 и Col 7рассчитывать вхождения значения в колонке 1 для каждой строки в колонке 2, используя AWK

chr_locations(col 1)  gene_name(col 7) 
chr1:66997989-67000678  geneA 
chr1:66997824-67000456  geneA 
chr2:33544389-33548489  geneB 
chr2:33546285-33547055  geneB 
chr2:44567890-44568980  geneB 

я бы нравится считать вхождения локализаций для данного гена:

chr1:66997989-67000678 geneA  2 
chr1:66997824-67000456 geneA  2 
chr2:33544389-33548489 geneB  3 
chr2:33546285-33547055 geneB  3 
chr2:44567890-44568980 geneB  3 

Я уверен, что есть более простой способ сделать это в AWK, чем писать сценарий в Python, может любые из вас помочь? Благодарю.

+4

* Я уверен, что есть более простой способ сделать это в awk, чем писать скрипт в python *. * Легче * означает, что у вас уже есть версия в Python, которая * не * легко ?. Можете ли вы показать это ?. Также проверьте эту страницу, которая поможет вам правильно отформатировать ваш вопрос: http://stackoverflow.com/editing-help – hek2mgl

+0

Что такое вклад столбца 1 в подсчеты? – karakfa

+1

Можете ли вы объединить 'cut' для столбцов 1 и 7,' sort' и 'uniq -c'? –

ответ

1

с обоими языками легко (любой язык действительно) .... все зависит от ваших знаний

AWK

awk '{ 
    count[$7]++; 
    memory_1[NR] = $1; 
    memory_7[NR] = $7; 
} 
END{ 
    for(i=1; i<=NR; ++i) print memory_1[i] OFS memory_7[i] OFS count[memory_7[i]] 
}' file 

питон

records = [line.split() for line in open("file").readlines()] 
from collections import Counter 
count = Counter(r[6] for r in records) 
print "\n".join("\t".join((r[0], r[6], str(count[r[6]]))) for r in records) 

вы получите :

 
chr1:66997989-67000678 geneA 2 
chr1:66997824-67000456 geneA 2 
chr2:33544389-33548489 geneB 3 
chr2:33546285-33547055 geneB 3 
chr2:44567890-44568980 geneB 3 
+2

Следует упомянуть, что для решения awk-решения требуется GNU awk4.0 или более поздняя версия для настоящих многомерных массивов. Или вы можете использовать старый синтаксис псевдо-многомерного массива (например, 'memory [NR, 1]'), так как вы не делаете ничего, что требует истинных массивов m-d. –

+1

Да, это может быть трудно запомнить. Существует довольно обширный список по адресу http://www.gnu.org/software/gawk/manual/gawk.html#POSIX_002fGNU и http://www.gnu.org/software/gawk/manual/gawk.html#Feature- История (вам нужно объединить обе страницы, чтобы получить полный список), но некоторые из вещей, которые были gawk-only, когда они были введены, теперь принимаются POSIX (например, 'delete array'), так что вторая ссылка - это не только gawk-only материал, это тот материал, который по крайней мере когда-то был gawk-only (большинство из них все еще есть, хотя). –

2

Вам нужен массив, чтобы сохранить счетчик, и использовать ключ массив, построенный с 2 ​​колонками

awk ' 
    {count[$1 OFS $7]++} 
    END {for (key in count) print key, count[key]} 
' file | sort 

Вы должны предоставить некоторые фактические данные, если вы ожидаете нам проверить наши ответы.

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