Команда объединения вставляет совпадающие поля как новые строки. Как можно создать одну строку для каждого совпадения? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь объединить таблицы с некоторыми общими полями в одну таблицу.

file1 выглядит так:

organism score_1
orgA 1
orgC 0

file2 выглядит так:

organism score_2
orgA 1
orgD 0

и я использую следующее, чтобы присоединиться к ним:

join -e 0 -v1 -j 1 --header file1.txt file2.txt > compile.txt

, но в результате получается

organism score_1 score_2
orgA 1
orgA 1
orgC 0
orgD 0

Что я пытаюсь получить, это

organism score_1 score_2
orgA 1 1
orgC 0 0
orgD 0 0

Есть предложения, как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Хитрость заключается в том, чтобы использовать -a, а не -v (Кстати, ваш вызов join не приводит к выводу, который вы сказали, что он сделал):

$ join --header -e 0 -a1 -a2 -j1 -o auto file1.txt file2.txt
organism score_1 score_2
orgA 1 1
orgC 0 0
orgD 0 0

(Требуется версия GNUприсоединиться, но поскольку вы уже используете --header, я полагаю, это не проблема)

0 голосов
/ 21 апреля 2019

Вот один в awk:

$ awk '
NR==FNR {                  # hash file1 to hash a
    a[$1]=$2
    next
}
{                          # process file2
    if($1 in a) {          # if $1 in file1 
        print $1,a[$1],$2  # output 
        delete a[$1]       # ... and delete
    } else                 # if not found in file1
        print $1,$2,$2     # output differently
}
END {                      # output the leftovers from file1
    for(i in a)            # order is awk implementation specific
        print i,a[i],a[i]
}' file1 file2

Вывод:

organism score_1 score_2
orgA 1 1
orgD 0 0
orgC 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...