2012-03-21 2 views
3

У меня есть два файла, которые выглядят следующим образом:Unix: слияние файлов на основе значения столбца

Файл 1 (2 колонки):

ID1 123 
ID2 234 
ID3 232 
ID4 344 
... 

Файл 2 (> 1 млн столбцов)

ID2 A C ... 
ID3 G T ... 
ID1 C T ... 
ID4 A C ... 
... 

Я хочу добавить значения из столбца 2 файла 1 на основе идентификатора файла 2 в качестве второго столбца. Таким образом, слитый файл должен выглядеть следующим образом:

ID2 234 A C ... 
ID3 232 G T ... 
ID1 123 C T ... 
ID4 344 A C ... 
... 

Так точно так же, как файл 2 (такой же порядок строк), но с добавлением 2-й колонке. Идентификаторами являются значения первого столбца (присутствующие в обоих файлах). Файл 1 имеет больше строк/идентификаторов, чем файл 2. Все идентификаторы из файла 2 находятся в файле 1, но не все ID из файла 1 находятся в файле 2.

Кто-нибудь знает, как это сделать в unix/bash? Большое спасибо!

+0

Сколько строк есть? (Можно ли загрузить весь файл 1 в память?) – ruakh

+0

Файл 1 имеет около 4 миллионов строк, файл 2 содержит от десятков тысяч до сотен тысяч строк (у меня фактически есть несколько файлов в формате файла 2, поэтому Я должен делать это несколько раз (= для каждого файла)) – Abdel

ответ

6
$ join <(sort file1) <(sort file2) 
ID1 123 C T ... 
ID2 234 A C ... 
ID3 232 G T ... 
ID4 344 A C ... 

Если вы хотите сохранить порядок file2

$ join -1 1 -2 2 <(sort file1) <(cat -n file2 | sort -k2,2) | sort -k3,3n | cut -d' ' -f1-2,4- 
ID2 234 A C ... 
ID3 232 G T ... 
ID1 123 C T ... 
ID4 344 A C ... 
+0

Спасибо! Это, похоже, работает, за исключением того, что по какой-то причине он запускает новую строку после каждого значения добавленного второго столбца ... (поэтому каждая строка теперь имеет 2 строки, вторая строка начинается с «CT ...»). Любая идея почему это может быть? – Abdel

+1

@Abdel, я думаю, это потому, что в конце строки есть дополнительный \ r. Если вы используете dos2unix для «process» file1 сначала, чтобы удалить эти \ r, тогда это должно быть ОК. –

+0

Спасибо, это сработало! – Abdel

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