Как посчитать количество строк конкретной записи по определенному шаблону с помощью awk? - PullRequest
0 голосов
/ 04 июня 2018

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

Sample1
Feature 1
A
B
C
Feature 2
A
G
H
L
Sample2
Feature 1
A
M
W
Feature 2
P
L

Я пытаюсь подсчитать, сколько записей для каждой функции в каждом образце.Поэтому мой желаемый вывод должен выглядеть примерно так:

Sample1
Feature 1: 3
Feature 2: 4

Sample2
Feature 1: 3
Feature 2: 2

Я попытался использовать следующую команду awk:

$ awk '{if(/^\Feature/){n=$0;}else{l[n]++}}
       END{for(n in l){print n" : "l[n]}}' inputfile.txt > result.txt

Но он дал мне следующий вывод

Feature 1: 6
Feature 2: 6

Итак, мне было интересно, может ли кто-нибудь помочь мне изменить эту команду, чтобы получить желаемый результат, или предложить мне другую команду?(PS оригинальный файл содержит сотни образцов и около 94 функций)

Ответы [ 4 ]

0 голосов
/ 04 июня 2018
$ cat tst.awk
BEGIN { OFS = ": " }
/Sample/  { prtFeat(); print (NR>1 ? ORS : "") $0; next }
/Feature/ { prtFeat(); name=$0; next }
{ ++cnt }
END { prtFeat() }
function prtFeat() {
    if (cnt) {
        print name, cnt
        cnt = 0
    }
}

$ awk -f tst.awk file
Sample1
Feature 1: 3
Feature 2: 4

Sample2
Feature 1: 3
Feature 2: 2
0 голосов
/ 04 июня 2018

Это awk также может работать:

awk '/^Sample/ {
   for (i in a)
      print i ": " a[i]
   print
   delete a
   next
}
/^Feature/ {
   f = $0
   next
}
{
   ++a[f]
}
END {
   for (i in a) 
      print i ": " a[i]
}' file

Sample1
Feature 1: 3
Feature 2: 4
Sample2
Feature 1: 3
Feature 2: 2
0 голосов
/ 04 июня 2018

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

awk '/^Sample/{printf "%s%s",(c?c"\n":""),$0;c=0;next}
     /^Feature/{printf "%s\n%s: ",(c?c:""),$0;c=0;next}
     {c++}
     END{print c}' file

Сценарий увеличивает счетчик c только для строк, которые не начинаются с Sample или Feature.

Если найдено одно из 2 ключевых слов, счетчик печатается.

0 голосов
/ 04 июня 2018

После awk может помочь вам здесь.

awk '
/^Sample/ && count1 && count2{
   print "Feature 1:",count1 ORS "Feature 2:",count2;
   count1=count2=flag1=flag2=""}
/^Sample/{
   print;
   flag=1;
   next}
flag && /^Feature/{
   if($NF==1){ flag1=1 };
   if($NF==2){ flag2=1;
               flag1=""};
   next}
flag && flag1{ count1++ }
flag && flag2{ count2++ }
END{
   if(count1 && count2){
      print "Feature 1:",count1 ORS "Feature 2:",count2}
}'  Input_file

Вывод будет следующим.

Sample1
Feature 1: 3
Feature 2: 4
Sample2
Feature 1: 3
Feature 2: 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...