Как улучшить команду соединения GNUwin32?

Я не могу получить желаемые результаты, используя соединение.

Я использую GNUwin32 в Windows 7 64 bit. Я работаю в версии 5.3.0.1936 и gawk версии 3.1.6.2962.

Вводятся следующие две таблицы:

Таблица 1

UID_C   CID
C000002 31799
C000002 31800
C000386 14950
C000386 9807916
C000386 10255083
C008114 5318432
C008117 799
C008117 444150
C008117 46878464

Таблица 2

UID_C   CID name
C000002 31799   bevonium
C000002 31800   bevonium
C002284 24832095    hypromellose
C008117 799 indoleglycerol phosphate
C008117 444150  indoleglycerol phosphate
C008117 46878464    indoleglycerol phosphate

Я использую следующую команду в bat-файле:

C:\gnuwin32\bin\join -t"|" -1 1 -2 1 -a1 -a2 -e "NULL" -o "0,1.2,2.2,2.3" C:\directory\Table_1.txt C:\directory\Table_2.txt > C:\directory\Table_3.txt

На моей иллюстрации, посвященной stackru, таблицы отформатированы с использованием вкладок для более удобного чтения, но на практике я использую pipe в качестве разделителя ввода и вывода.

Следующая таблица выводится:

Table_3

UID_C   CID CID name
C000002 31800   31799   bevonium
C000002 31800   31800   bevonium
C000002 31799   31799   bevonium
C000002 31799   31800   bevonium
C000386 10255083    NULL    NULL
C000386 9807916 NULL    NULL
C000386 14950   NULL    NULL
C002284 NULL    24832095    hypromellose
C008114 5318432 NULL    NULL
C008117 46878464    799 indoleglycerol phosphate
C008117 46878464    444150  indoleglycerol phosphate
C008117 46878464    46878464    indoleglycerol phosphate
C008117 444150  799 indoleglycerol phosphate
C008117 444150  444150  indoleglycerol phosphate
C008117 444150  46878464    indoleglycerol phosphate
C008117 799 799 indoleglycerol phosphate
C008117 799 444150  indoleglycerol phosphate
C008117 799 46878464    indoleglycerol phosphate

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

Table_4

UID_C   CID name
C000002 31799   bevonium
C000002 31800   bevonium
C000386 14950   NULL
C000386 9807916 NULL
C000386 10255083    NULL
C002284 24832095    hypromellose
C008114 5318432 NULL
C008117 799 indoleglycerol phosphate
C008117 444150  indoleglycerol phosphate
C008117 46878464    indoleglycerol phosphate

Как изменить команду соединения для получения желаемого результата?

В качестве альтернативы, как мне использовать awk в качестве пост-процесса для Table_3 для создания Table_4?

Заранее спасибо за совет.

1 ответ

Решение

Я думаю, что вам нужно больше логики, чем присоединиться к ProvideX:

awk -F"|" -v "OFS=|" '
    NR==FNR {uid_cid[$1 OFS $2]=1; next}
    { 
        key = $1 OFS $2
        if (key in uid_cid) {
            delete uid_cid[key]
        }
        print
    }
    END {
        for (key in uid_cid) {
            print key, "NULL"
        }
    }
' Table_1 Table_2 | sort -k1,1 -k2,2n -t "|"
C000002|31799|bevonium
C000002|31800|bevonium
C000386|14950|NULL
C000386|9807916|NULL
C000386|10255083|NULL
C002284|24832095|hypromellose
C008114|5318432|NULL
C008117|799|indoleglycerol phosphate
C008117|444150|indoleglycerol phosphate
C008117|46878464|indoleglycerol phosphate
Другие вопросы по тегам