2013-11-09 4 views
0

Невозможно произвести желаемые результаты с помощью соединения.Как улучшить команду объединения GNUwin32?

Запуск GNUwin32 в Windows 7 64 бит. Я запускаю версию присоединения версии 5.3.0.1936 и версию gawk 3.1.6.2962.

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

Table_1

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

Table_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 

Am, используя следующую команду в файле летучей мыши:

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 

В моей иллюстрация в stackoverflow таблицы Таблицы форматируются с помощью вкладок для упрощения чтения, но на практике я использую 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 для создания таблицы_4?

Заранее благодарим за консультацию.

ответ

2

Я думаю, что вам нужно больше логики, чем присоединиться к 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 
+0

Нужна небольшая помощь с советом. Column_1 - это UID (давайте остановим нижнее подчеркивание для простоты). Column_2 - это CID. Column_3 - это имя. Помогите мне перевести это на awk-фразы: {uid_cid [$ 1 OFS $ 2] = 1; next} _and_ key в uid_cid. Пока не подключаюсь. –

+0

Также с трудом выполняется под Windows. Я запускаю awk-код с вводом из table_1 и table_2. Переадресовываем это в новую таблицу_3, чтобы убедиться, что я понимаю обработку awk. Я получаю «errcount: 1» –

+0

Am, используя двойные кавычки (для Windows .bat), вместо одиночной кавычки, для разграничения awk-обработки. –