Как объединить разделенные пробелами файлы неравной длины (внутреннее объединение) с помощью объединения в Linux? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть простая проблема: у меня есть файл, разделенный пробелами, и я хочу добавить столбец из другого файла, разделенного пробелами, но этот второй файл длиннее. Я хочу выполнить внутреннее соединение (поэтому добавьте только столбец, а не строки). Я хочу сделать это с linux join (по соображениям эффективности). Я видел подобные вопросы, но, поскольку я только начинающий, я не могу найти нужную мне информацию и применить ее к своему делу.

Я удалил заголовки и отсортировал их по ключевому столбцу (первый столбец в обоих файлах). Я проверил дубликаты ключей (их не было).

join -1 1 -1 1 <(sort -k1 file1) <(sort -k1 file2) > file3

File 1:
rs1248851 C 655 0.7666 -0.8358 0.4033
rs1248857 G 654 1.069 0.4283 0.6684
rs1248860 G 656 1.052 0.3234 0.7464
rs12488651 G 652 1.246 1.343 0.1792
rs1248865 C 649 0.7419 -0.9125 0.3615
rs1248866 C 649 0.7696 -0.8053 0.4207
rs1248868 C 649 0.7717 -0.8317 0.4056
rs1248869 T 647 0.7878 -0.766 0.4437

File 2:
rs1248851 G
rs1248857 A
rs1248858 C
rs1248859 C
rs1248860 A
rs1248861 T
rs12488651 T
rs1248865 G
rs1248866 G
rs1248867 G
rs1248868 T
rs1248869 C

Expected result File 3:
rs1248851 C 655 0.7666 -0.8358 0.4033 G
rs1248857 G 654 1.069 0.4283 0.6684 A
rs1248860 G 656 1.052 0.3234 0.7464 A
rs12488651 G 652 1.246 1.343 0.1792 T
rs1248865 C 649 0.7419 -0.9125 0.3615 G
rs1248866 C 649 0.7696 -0.8053 0.4207 G
rs1248868 C 649 0.7717 -0.8317 0.4056 T
rs1248869 T 647 0.7878 -0.766 0.4437 C


Actual resulting error message:
join: /dev/fd/63:5: is not sorted: rs1248865 C 649 0.7419 -0.9125 0.3615
join: /dev/fd/62:8: is not sorted: rs1248865 G

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Команда join в linux кажется более многословной, но все равно приводит к файлу file3 с ожидаемыми результатами.join на macOS не жалуется.

Если вы все еще хотите использовать что-то еще, вы можете попробовать отфильтровать file2 по ключам, присутствующим в file1, например:

for i in `cut -f1 -d' ' file1`; do grep $i file2 >> file2.filtered; done;

А затем используйте оригинал join, который у вас уже был:

join -1 1 -1 1 <(sort -k1 file1) <(sort -k1 file2.filtered) > file3
0 голосов
/ 02 июля 2019

Не уверен насчет вашей логики с join или почему она жалуется, но ...

awk 'NR==FNR{a[$1]=$0};NR!=FNR{if($1 in a){print a[$1],$2}}' file1 file2
rs1248851 C 655 0.7666 -0.8358 0.4033 G
rs1248857 G 654 1.069 0.4283 0.6684 A
rs1248860 G 656 1.052 0.3234 0.7464 A
rs12488651 G 652 1.246 1.343 0.1792 T
rs1248865 C 649 0.7419 -0.9125 0.3615 G
rs1248866 C 649 0.7696 -0.8053 0.4207 G
rs1248868 C 649 0.7717 -0.8317 0.4056 T
rs1248869 T 647 0.7878 -0.766 0.4437 C

Давайте сломаем awk вниз; в то время как NR (номер записи во всех входных данных) соответствует FNR (номер записи в файле), мы сохраняем каждую строку в массив, используя записи первого столбца в качестве индекса.

Когда мы достигаем второго файла и его первый столбец можно найти в нашем ранее созданном массиве, мы печатаем строку из первого файла, за которой следует второй столбец из второго файла.

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