Как я могу получить количество уникальных персонажей подряд с помощью awk? - PullRequest
0 голосов
/ 01 июля 2011

У меня есть текстовый файл, который выглядит так:

A A A G A A
A A A A A A
G A G A G G
A G G G G G
G A A A A A
T C T C C C
A A A G A A
C C C C C C
T G G G G G
T T T T T T

Я хочу посчитать количество вхождений каждой буквы за строкой.Существует довольно много документации о том, как сделать это по полю, но не по строке.Я думал что-то вроде: for(i=1; i <= NF, i++), чтобы перебрать столбцы в каждой строке, а затем создать переменную-счетчик для добавления вхождений.Есть ли более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 01 июля 2011

У меня не так много с awk, вот версия perl:

perl -ne 'my %c; $c{$_}++ for split; print scalar keys %c'

Вывод

212222212

Если хотите, добавьте новую строку

perl -ne 'my %c; $c{$_}++ for split; print scalar keys %c . "\n"'

Редактировать

В ответ на комментарий, возможно, это больше похоже на то, что вы имели в виду:

perl -ne 'my %c; $c{$_}++ for split; print "$_:$c{$_} " for keys %c; print "\n"'

Вывод:

A:5 G:1 
A:6 
A:2 G:4 
A:1 G:5 
A:5 G:1 
T:2 C:4 
A:5 G:1 
C:6 
T:1 G:5 
T:6 
0 голосов
/ 01 июля 2011

В awk я не думаю, что есть более простой способ перебора полей в строке.

awk '
  {
    delete a
    for (i=1; i<=NF; i++)
      a[$i]++
    printf("%d -- ", NR)
    for (val in a)
      printf("%s:%d, ", val, a[val])
    print ""
  }
'

Учитывая ваш ввод, это выдает

1 -- A:5, G:1, 
2 -- A:6, 
3 -- A:2, G:4, 
4 -- A:1, G:5, 
5 -- A:5, G:1, 
6 -- C:4, T:2, 
7 -- A:5, G:1, 
8 -- C:6, 
9 -- G:5, T:1, 
10 -- T:6, 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...