Bash, объедините две таблицы различной длины, используя sort и join - PullRequest
0 голосов
/ 14 октября 2018

Я понимаю, что это повторение, но решения в других постах не будут работать для меня, извинения.

У меня есть две таблицы, testcut.pileup:

chrM    1370    T       1
chrM    1371    T       1
chrM    1372    C       1
chrM    1373    T       1
chrM    1374    A       1

И testcut2.pileup:

chrM    720     T       1
chrM    721     T       1
chrM    722     C       1
chrM    723     A       0
chrM    724     C       1
chrM    1370    T       2
chrM    1371    T       3
chrM    1372    C       4
chrM    1373    T       3
chrM    1374    A       2

Я хочу объединить эти наборы данных, чтобы они отображались рядом друг с другом.В идеальном мире они были бы организованы числами во вторых столбцах (как показано ниже), но я был бы рад просто иметь их рядом друг с другом.

Желаемый результат:

                             chrM    720     T       1
                             chrM    721     T       1
                             chrM    722     C       1
                             chrM    723     A       0
                             chrM    724     C       1
chrM    1370    T       1    chrM    1370    T       2
chrM    1371    T       1    chrM    1371    T       3
chrM    1372    C       1    chrM    1372    C       4
chrM    1373    T       1    chrM    1373    T       3
chrM    1374    A       1    chrM    1374    A       2

Пока я пытаюсь это сделать:

join -j 2 <(sort -k 2 testcut.pileup) <(sort -k 2 testcut2.pileup) > join.pileup

Но я получаю следующие ошибки:

join: file 1 is not in sorted order
join: file 2 is not in sorted order

Если я бегу join прямо, числа во втором столбце смещаются:

chrM 1370 T 1 720 T 1
chrM 1370 T 1 721 T 1
chrM 1370 T 1 722 C 1
chrM 1370 T 1 723 A 0
chrM 1370 T 1 724 C 1

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

С объединением, сортировкой и bash:

join -j 2 <(sort -t $'\t' -k 2 testcut.pileup) <(sort -t $'\t' -k 2 testcut2.pileup) -a 2 -t $'\t' -o1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4 | sort -t $'\t' -k6n

Я полагаю, ваш разделитель полей - одна вкладка.

Вывод:

                                chrM    720     T       1
                                chrM    721     T       1
                                chrM    722     C       1
                                chrM    723     A       0
                                chrM    724     C       1
chrM    1370    T       1       chrM    1370    T       2
chrM    1371    T       1       chrM    1371    T       3
chrM    1372    C       1       chrM    1372    C       4
chrM    1373    T       1       chrM    1373    T       3
chrM    1374    A       1       chrM    1374    A       2
0 голосов
/ 14 октября 2018

awk на помощь!

вы можете сделать его более универсальным, но я жестко запрограммирован для 4 полей

$ awk 'NR==FNR {a[$2]=$0; next} 
               {print  $2 in a?a[$2] "\t" $0:"\t\t\t\t"$0}' file{1,2} | 
  column -ts'\t'

                                chrM    720     T       1
                                chrM    721     T       1
                                chrM    722     C       1
                                chrM    723     A       0
                                chrM    724     C       1
chrM    1370    T       1       chrM    1370    T       2
chrM    1371    T       1       chrM    1371    T       3
chrM    1372    C       1       chrM    1372    C       4
chrM    1373    T       1       chrM    1373    T       3
chrM    1374    A       1       chrM    1374    A       2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...