Поиск и замена с помощью AWK, но в файле с несколькими столбцами и разделителями

С GNU grepвы можете использовать:

grep -Eo '\S+'

Который печатает все последовательности из одного или нескольких(+)не -непробельных символов(\S)по одному в строке.

1
16.09.2021, 10:12
1 ответ

Использование 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

Выше я предполагаю, что порядок появления аннотаций в каждой строке вывода не имеет значения, если все они присутствуют и уникальны в строке.

4
16.09.2021, 18:07

Теги

Похожие вопросы