С GNU grep
вы можете использовать:
grep -Eo '\S+'
Который печатает все последовательности из одного или нескольких(+
)не -непробельных символов(\S
)по одному в строке.
Использование GNU awk для массивов массивов:
$ cat tst.awk
NR==FNR {
genes_annots[$1][$3]
next
}
{
delete annots
for ( i=2; i<=NF; i++ ) {
gene = $i
if ( gene in genes_annots ) {
for ( annot in genes_annots[gene] ) {
annots[annot]
}
}
}
printf "%s", $1
for (annot in annots) {
printf "%s%s", OFS, annot
}
print ""
}
$ awk -f tst.awk file2 FS='[, ]+' file1
OG0000008 PF01509 PF16207 PF13923 PF04845
OG0000009 PF00250 PF02779 PF00379 PF04949 PF00456 PF02780
OG0000010 PF08704 PF04949 PF00400
Вышеописанное будет работать, даже если у вас есть 2 отдельных гена с одинаковой аннотацией, например. гены Tni22G01900 и BANYX1.2.t00861 имеют аннотацию PF04949 :
.$ cat file3
OG0000099,Tni22G01900, BANYX1.2.t00861
$ awk -f tst.awk file2 FS='[, ]+' file3
OG0000099 PF08704 PF04949
Выше я предполагаю, что порядок появления аннотаций в каждой строке вывода не имеет значения, если все они присутствуют и уникальны в строке.