Формат данных в табличный формат - PullRequest
7 голосов
/ 18 марта 2020

Я новичок в кодировании, но мне интересно, как проще всего создать таблицу из данных счетчика grep.

Мой выходной файл счетчика grep выглядит следующим образом:

AAR34355.1
./006D_id70.m8:0
./20D_id70.m8:0
./28D_id70.m8:0
AAR38850.1
./006D_id70.m8:0
./20D_id70.m8:2
./28D_id70.m8:4
A13520.1
./006D_id70.m8:0
./20D_id70.m8:0
./28D_id70.m8:0

Мне нужно, чтобы вывод выглядел примерно так:

            ./006D_id70.m8    ./20D_id70.m8    ./28D_id70.m8
AAR34355.1         0                0                 0
AAR38850.1         0                2                 4
A13520.1           0                0                 0

или хотя бы эквивалентный разделитель.

Прости мое описание, так как я довольно новичок в этом.

Есть ли относительно простой способ форматирования данных таким способом?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вы можете сделать все это в awk, не нужно менять форму вывода grep. Предполагается, что шаблоны для поиска перечислены в файле с именем patterns, а файлы для поиска: file1, file2 и file3; скопируйте и сохраните следующий блок кода в файл с именем tst.awk,

NR == FNR {
  pat[NR] = $0
  next
}

FNR == 1 {
  fil[c++] = FILENAME
}

{
  for (i in pat)
    if ($0 ~ pat[i])
      mat[FILENAME, pat[i]]++
}

END {
  for (i in fil)
    printf "\t%s", fil[i]

  print ""

  for (i in pat) {
    printf "%s", pat[i]

    for (j in fil)
      printf "\t%d", mat[fil[j], pat[i]]

    print ""
  }
}

и запустите

awk -f tst.awk patterns file1 file2 file3

Демо:

$ seq 5 > file1
$ seq 3 7 > file2
$ seq 5 9 > file3
$ seq 3 2 7 > patterns
$ awk -f tst.awk patterns file1 file2 file3
        file1   file2   file3
3       1       1       0
5       1       1       1
7       0       1       1
0 голосов
/ 18 марта 2020
Сначала

скрипт OP, но в более удобной для читателя форме

#!/bin/bash
while read   protein; do
    echo    $protein
    grep -c $protein ./*.m8
done < test_just_IDs.txt

даст

$ ./test
AAR34355.1
./006D_id70.m8:0
./20D_id70.m8:0
./28D_id70.m8:0
AAR38850.1
./006D_id70.m8:0
./20D_id70.m8:2
./28D_id70.m8:4
A13520.1
./006D_id70.m8:0
./20D_id70.m8:0
./28D_id70.m8:0

И если мы немного изменим его

#!/bin/bash
printf "\t"; ls ./*.m8
while read   protein; do
    printf "$protein\t"
    printf "%s\t\t" $(grep -hc $protein ./*.m8)
    echo
done < test_just_IDs.txt

Это будет дать желаемый результат

$ ./test
        ./006D_id70.m8  ./20D_id70.m8  ./28D_id70.m8
AAR34355.1      0               0               0       
AAR38850.1      0               2               4       
A13520.1        0               0               0

И с чем-то вроде этого (для вкладки 8)

#!/bin/bash
line='%16s';        printf "\t\t"
for file in *.m8; { printf "| %s\t" $file; line+='+%15s'; }
while read   protein; do
    printf "\n$line\n" | tr " " "-"
    printf "$protein\t"
    printf "|\t%s\t" $(grep -ch $protein *.m8)
done < test_just_IDs.txt

Мы получим реальный вид таблицы

$ ./test
                | 006D_id70.m8  | 20D_id70.m8   | 28D_id70.m8   
----------------+---------------+---------------+---------------
AAR34355.1      |       0       |       0       |       0   
----------------+---------------+---------------+---------------
AAR38850.1      |       0       |       2       |       4   
----------------+---------------+---------------+---------------
A13520.1        |       0       |       0       |       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...