подсчет появления персонажа - PullRequest
1 голос
/ 11 июля 2019

У меня есть файл, который выглядит следующим образом

chr1A_p1
chr1A_p2
chr10B_p1
chr10A_p1
chr11D_p2
chr18B_p2
chr9D_p1

Мне нужно подсчитать количество раз, когда происходят A, B & D.По отдельности, я бы сделал это так:

awk '{if($1~/A/) print $0 }' < test.txt | wc
awk '{if($1~/B/) print $0 }' < test.txt | wc
awk '{if($1~/D/) print $0 }' < test.txt | wc

Как соединить эти строки, чтобы я мог посчитать количество A, B, D только через один лайнер вместо 3 отдельных строк.

Ответы [ 4 ]

2 голосов
/ 11 июля 2019

Для определенного формата строки (где необходимый символ находится перед _):

$ awk -F"_" '{ seen[substr($1, length($1))]++ }END{ for(k in seen) print k, seen[k] }' file
A 3
B 2
D 2
2 голосов
/ 11 июля 2019

Подсчет вхождений обычно выполняется путем отслеживания счетчика.Таким образом, одну из строк awk ОП;

awk '{if($1~/A/) print $0}' < test.txt | wc

можно переписать как

awk '($1~/A/){c++}END{print c}' test.txt

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

awk '($1~/A/){c["A"]++}
     ($1~/B/){c["B"]++}
     ($1~/D/){c["D"]++}
     END{for(i in c) print i,c[i]}' test.txt

СейчасВы можете даже очистить это немного больше:

awk '{c["A"]+=($1~/A/)}
     {c["B"]+=($1~/B/)}
     {c["D"]+=($1~/D/)}
     END{for(i in c) print i,c[i]}' test.txt

, который вы можете очистить как:

awk 'BEGIN{split("A B D",a)}
     {for(i in a) c[a[i]]+=($1~a[i])}
     END{for(i in c) print i,c[i]}' test.txt

Но эти случаи просто подсчитывают, сколько раз встречается строка, содержащаяписьмо, а не сколько раз письмо встречается.

awk 'BEGIN{split("A B D",a)}
     {for(i in a) c[a[i]]+=gsub(a[i],"",$1)}
     END{for(i in c) print i,c[i]}' test.txt
1 голос
/ 11 июля 2019

файл данных:

chr1A_p1
chr1A_p2
chr10B_p1
chr10A_p1
chr11D_p2
chr18B_p2
chr9D_p1

script.awk

BEGIN {
    arr["A"]=0
    arr["B"]=0
    arr["D"]=0
} 
/A/ { arr["A"]++ }
/B/ { arr["B"]++ } 
/D/ { arr["D"]++ }  
END {
    printf "A: %s, B: %s, D: %s", arr["A"], arr["B"], arr["D"]
}

исполнение:

 awk -f script.awk datafile

результат:

A: 3, B: 2, D: 2
1 голос
/ 11 июля 2019

Perl на помощь!

perl -lne '$seen{$1}++ if /([ABD])/; END { print "$_:$seen{$_}" for keys %seen }' < test.txt
  • -n читает строку ввода построчно
  • -l удаляет символы новой строки из ввода и добавляет их в вывод
  • хеш-таблица %seen используется для хранения количества вхождений каждого символа. Каждый раз, когда это соответствует, это захватывается, и соответствующее поле в хэше увеличивается.
  • END запускается, когда файл заканчивается. Он выводит все ключи хеша, то есть совпадающие символы, за которыми следует количество вхождений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...