2010-09-16 3 views
3

Я пытаюсь объединить два списка, объединив их с общим полем, таким как ENST00000371026. Я пробовал следующее, но не повезло. Каков реальный способ сделать это?объединить два списка с соединением в столбце

cat> gar1.txt <<EOF 
ENST00000371026 ENSG00000152763 
ENST00000371023 ENSG00000152763 
ENST00000395250 ENSG00000152763 
ENST00000309502 ENSG00000163485 
ENST00000377464 ENSG00000142599 
ENST00000400908 ENSG00000142599 
ENST00000337907 ENSG00000142599 
ENST00000400907 ENSG00000142599 
ENST00000401087 ENSG00000179571 
EOF 

cat> gar2.txt <<EOF 
DDX11L1 ENST00000371026 
DDX11L9 ENST00000309502 
DDX11L1 ENST00000371026 
OR4F5 ENST00000377464 
DQ597235  n/a 
DQ599768  n/a 
LOC388312  ENST00000401087 
LOC100132287 ENST00000425496 
LOC100132287 ENST00000425496 
EOF 

join -t"\t" -2 2 -1 1 gar1.txt gar2.txt 

Пример вывода будет:

DDX11L1 ENSG00000152763 
DDX11L9 ENSG00000163485 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 NONE 
+0

Объединить их как? Чередование линий? Возьмите столбцы из файла gar2.txt и добавьте каждую строку в первый файл? – zigdon

+0

Я хотел бы использовать gar1 в качестве индекса. Затем замените значения ENST в gar2 на ENSG и получите список уникальных значений ENSG с соответствующим полем 1 файла gar2.txt –

+0

См. Мой отредактированный ответ. (Я повторил это здесь, так как я не знаю, будет ли адресация @ работать с вашим коротким именем пользователя.) –

ответ

3

Дайте этому попытку:

join -a 2 -t $'\t' -2 2 -1 1 -o 2.1 1.2 <(sort gar1.txt) <(sort -k 2,2 gar2.txt) | sed '/\t$/ s/$/NONE/' | uniq 

Он использует процесс Bash замену (<()), но вы можете просто сортировать почту перед отправкой на почтамт ваши файлы, если не хотят этого использовать. Ваша версия join должна иметь опцию -o, или вы можете использовать awk для дальнейшей обработки вывода. Для «N/A» линии он будет печатать «NONE», но вы могли бы сделать это, чтобы устранить их:

<(sort -k 2,2 gar2.txt | grep -v 'n/a$') 

Edit:

Это выход я без sed и uniq :

DDX11L9 ENSG00000163485 
DDX11L1 ENSG00000152763 
DDX11L1 ENSG00000152763 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 
LOC100132287 
DQ597235 
DQ599768 

И это то, что я с ними:

DDX11L9 ENSG00000163485 
DDX11L1 ENSG00000152763 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 NONE 
DQ597235  NONE 
DQ599768  NONE 

Добавление grep:

DDX11L9 ENSG00000163485 
DDX11L1 ENSG00000152763 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 NONE 

, который соответствует вашему примеру вывода для заказа, за исключением. Если вам нужно сохранить заказ, это можно будет сделать.

+0

+1 полезно, однако join -a 2 -t $ '\ t' -2 2 -1 1 -o 2.1 1.2 <(sort gar1.txt) <(sort -k 2,2 gar2.txt), похоже, выводит отсортированный файл gar2.txt, а не выход ожидания. Он работал для вас для файлов примеров? –

+0

@ D W: Смотрите мое редактирование. –

+0

Я делал глупую ошибку. Скрипт отлично работает! –

Смежные вопросы