2015-12-21 2 views
2

Я пытаюсь сосчитать уникальные записи в $2 в файл перед |:счетчика на поле в AWK перед тем символом трубы

файла

chr11:101323676-101323847 TRPC6|gc=39.2 143.1 
chr11:101324359-101324478 TRPC6|gc=38.7 146.4 
chr11:101325731-101325850 TRPC6|gc=32.8 84.5 
chr11:101341904-101342127 TRPC6|gc=43.5 197.9 
chr12:5153304-5155165 KCNA5|gc=65.1 633.7 
chr12:52306230-52306349 ACVRL1|gc=58.8 152.4 
chr12:52306868-52307149 ACVRL1|gc=66.5 309.6 
chr12:52307328-52307569 ACVRL1|gc=66.8 305.9 
chr12:52307743-52307872 ACVRL1|gc=64.3 267.1 

желаемых выходного

Пробовал:

awk '{sub(/:.*/,"",$2)} !seen[$2]++{unq++} END{print unq}' file.txt 

В настоящее время я получаю очень разное количество и думаю, что это necause мне нужно разделить на |, но не уверен, что правильный способ сделать это. Спасибо :).

+1

добавить еще один подпункт, то есть 'суб/\ |. * $ /, "", $ 0)'. Удачи. – shellter

+0

hm .. Я также думаю, что вам нужно отлаживать ваши шаги. Добавление 'print #dbg: $ 2 before =" $ 2' и 'print" #dbg $ 2 после = "$ 2' в соответствующих местах должно помочь. Удачи. – shellter

ответ

3

Вы были почти там. Вам просто нужно заменить : на \| в регулярных выражениях, используемых в sub():

awk '{sub(/\|.*/,"",$2)}!seen[$2]++{c++}END{print c}' file 

Вы также можете играть с разделителем, как это:

awk -F'[|]| +' '!seen[$2]++{c++}END{print c}' file 

Я использую либо | или один или более пробелы в качестве разделителя. Это позволяет получить доступ к интересующей части как $2.

Остальная часть следует той же логике, что и пример в вашем вопросе: мы используем $2 как индекс в таблице поиска seen и проверяем, появился ли этот индекс раньше. Если нет, мы увеличиваем счетчик c, а в конце печатаем c.

4

awk на помощь!

$ awk '{split($2,a,"|"); c[a[1]]} 
    END{for(k in c) count++; print count}' file 

3 

или сокращенный вариант

$ awk '{split($2,a,"|"); if(!c[a[1]]++) count++} 
    END{print count}' file 

кратчайшее

$ awk 'split($2,a,"|") && !c[a[1]]++{u++} END{print u}' file 
+0

Спасибо всем очень :) – Chris

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