В этих ответах имена переменных сокращаются до 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
.