Объединить несколько переменных grep в один файл по столбцам - PullRequest
0 голосов
/ 26 июня 2018

У меня есть несколько выражений grep, которые подсчитывают количество строк, соответствующих строке, каждое для группы файлов с различным расширением:

Nreads_ini=$(grep -c '^>' $WDIR/*_R1.trim.contigs.fasta)
Nreads_align=$(grep -c '^>' $WDIR/*_R1.trim.contigs.good.unique.align)
Nreads_preclust=$(grep -c '^>' $WDIR/*_R1.trim.contigs.good.unique.filter.unique.precluster.fasta)
Nreads_final=$(grep -c '^>' $WDIR/*_R1.trim.contigs.good.unique.filter.unique.precluster.pick.fasta)

Каждый из этих greps выводит имя образца и количество случаев следующим образом.

Первый:

PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.fasta:13175
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.fasta:14801
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.fasta:13475
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.fasta:13424
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.fasta:12053

Второй:

PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.good.unique.align:12589
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.good.unique.align:13934
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.good.unique.align:12981
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.good.unique.align:12896
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.good.unique.align:11617

И так далее. Мне нужно создать файл .txt с этими числовыми выводами grep в виде столбцов, в которых имя образца является ключевым столбцом. Имя образца является частью имени файла перед "_R1" (V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA, V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG ...):

Sample                                   | Nreads_ini | Nreads_align  |
-----------------------------------------------------------------------
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT  | 13175      | 12589         | 
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT  | 14801      | 13934         | 
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT  | 13475      | 12981         | 
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG  | 13424      | 12896         |
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA  | 12053      | 11617         |

Есть идеи? Есть ли другое более простое решение для моей проблемы? Спасибо!

Ответы [ 3 ]

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

Не могли бы вы попробовать и дайте мне знать, если это вам поможет.

awk --re-interval -F"[/.:]"  '
BEGIN{
  print "Sample                                   | Nreads_ini | Nreads_align  |"
}
FNR==NR{
  match($2,/.*[A-Z]{10}/);
  array[substr($2,RSTART,RLENGTH)]=$NF;
  next
}
match($2,/.*[A-Z]{10}/) && (substr($2,RSTART,RLENGTH) in array){
  print substr($2,RSTART,RLENGTH),array[substr($2,RSTART,RLENGTH)],$NF
}
' OFS=" | "  first_one  second_one | column -t

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

Sample                                   |  Nreads_ini  |  Nreads_align  |
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT  |  13175       |  12589
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT  |  14801       |  13934
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT  |  13475       |  12981
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG  |  13424       |  12896
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA  |  12053       |  11617
0 голосов
/ 26 июня 2018

Если у вас есть файлы, содержащие данные, которые вы хотите проанализировать:

$ cat file1
PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.fasta:13175
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.fasta:14801
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.fasta:13475
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.fasta:13424
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.fasta:12053
$ cat file2
PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.good.unique.align:12589
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.good.unique.align:13934
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.good.unique.align:12981
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.good.unique.align:12896
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.good.unique.align:11617
$ cat file3 # This is a copy of file2 but could be different
PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.good.unique.align:12589
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.good.unique.align:13934
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.good.unique.align:12981
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.good.unique.align:12896
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.good.unique.align:11617

Если есть ключ типа V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT, вы можете использовать awk:

$ awk -F'[/.:]' '
    BEGINFILE{
      col[FILENAME]
    }
    { 
       row[$2]
       a[FILENAME,$2]=$NF
       next
    }
   END{
      for(i in row) { 
        printf "%s ",substr(i,1,length(i)-3)
        for(j in col) 
          printf "%s ",a[j SUBSEP i]; printf "\n" 
      }
  }' file1 file2 file3
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG 13424 12896 12896
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT 13175 12589 12589
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT 13475 12981 12981
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT 14801 13934 13934
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA 12053 11617 11617

Этот скрипт awk заполняет 3 массива col, row и a, которые соответственно хранят имя столбца (имя файла), содержимое строки и значения для всех файлов.

Оператор END печатает содержимое массива a, просматривая все строки и столбцы.

Если вам нужно украшение стола, используйте это:

{ printf "Sample Nreads_ini Nreads_align Nreads_align \n"; awk -F'[/.:]' 'BEGINFILE{col[FILENAME]}{row[$2];a[FILENAME,$2]=$NF;next}END{for(i in row) { printf "%s ",substr(i,1,length(i)-3); for(j in col) printf "%s ",a[j SUBSEP i]; printf "\n" }}' file1 file2 file3; } | column -t  -s' ' -o ' | '
0 голосов
/ 26 июня 2018

В этих ответах имена переменных сокращаются до ini и align.

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

e() { sed -E 's,^.*/(.*)_R1.*:(.*)$,\1\t\2,'; }

Затем мы объединяем извлеченные данные в один файл.Строки с одинаковым именем образца будут объединены.

join -t $'\t' <(e <<< "$ini") <(e <<< "$align")

Теперь мы почти получили ожидаемый результат.Нам нужно только добавить заголовок и нарисовать линии для таблицы.

join ... | column -to " | " -N Sample,ini,align

Это выведет

Sample                                  | ini   | align
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT | 13175 | 12589
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT | 14801 | 13934
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT | 13475 | 12981
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG | 13424 | 12896
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA | 12053 | 11617

Добавление горизонтальной линии после того, как заголовок оставлен в качестве упражнения для читателя.:)

Этот подход также работает с более чем двумя числовыми столбцами.Детали join и -N должны быть удлинены.join может работать только с двумя файлами, что требует использования громоздкого обходного пути ...

e() { sed -E 's,^.*/(.*)_R1.*:(.*)$,\1\t\2,'; }
join -t $'\t' <(e <<< "$var1") <(e <<< "$var2") |
join -t $'\t' - <(e <<< "$var3") | ... | join -t $'\t' - <(e <<< "$varN") |
column -to " | " -N Sample,Col1,Col2,...,ColN

... так что было бы проще добавить еще одну вспомогательную функцию

e() { sed -E 's,^.*/(.*)_R1.*:(.*)$,\1\t\2,'; }
j2() { join -t $'\t' <(e <<< "$1") <(e <<< "$2"); }
j() { join -t $'\t' - <(e <<< "$1"); }
j2 "$var1" "$var2" | j "$var3" | ... | j "$varN" |
column -to " | " -N Sample,Col1,Col2,...,ColN

В качестве альтернативы, если все входные данные содержат одинаковые сэмплы в одинаковом порядке, join можно заменить одной единственной командой paste.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...