Как объединить два файла на основе соответствия двух столбцов?

Мне нравится file1:

0   AFFX-SNP-000541  NA
0   AFFX-SNP-002255  NA
1   rs12103          0.6401
1   rs12103_1247494  0.696
1   rs12142199       0.7672

И файл2:

0   AFFX-SNP-000541   1
0   AFFX-SNP-002255   1
1   rs12103           0.5596
1   rs12103_1247494   0.5581
1   rs12142199        0.4931

И хотел бы файл3, чтобы:

0   AFFX-SNP-000541     NA       1
0   AFFX-SNP-002255     NA       1
1   rs12103             0.6401   0.5596
1   rs12103_1247494     0.696    0.5581
1   rs12142199          0.7672   0.4931

Это означает, что поставить 4-й столбец файла2 в файл1 по имени второго столбца.

27 голосов | спросил Dadong Zhang 7 FebruaryEurope/MoscowbFri, 07 Feb 2014 00:03:46 +0400000000amFri, 07 Feb 2014 00:03:46 +040014 2014, 00:03:46

3 ответа


42

Это должно сделать это:

join -j 2 -o 1.1,1.2,1.3,2.3 file1 file2

Важно : предполагается, что ваши файлы отсортированы (как в вашем примере) в соответствии с именем SNP. Если это не так, сначала выполните сортировку:

join -j 2 -o 1.1,1.2,1.3,2.3 <(sort -k2 file1) <(sort -k2 file2)

Вывод:

0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931

Объяснение (из ---- +: = 3 =: + ----):

  

`join 'записывает на стандартный вывод строку для каждой пары входных строк   которые имеют одинаковые поля объединения.

info join

Итак, команда выше объединяет файлы во втором поле и печатает первое, второе и третье поля файла 1, а затем 3-е поле файла2.

ответил terdon 7 FebruaryEurope/MoscowbFri, 07 Feb 2014 00:32:39 +0400000000amFri, 07 Feb 2014 00:32:39 +040014 2014, 00:32:39
14

Вы можете использовать awk:

$ awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' file2 file1 > file3

выход:

$ cat file3
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931

Объяснение:

Пройдите file2 (NR==FNR применим только для первого аргумента файла). Сохраните столбец 3 в хэш-массиве, используя столбец 2 в качестве ключа: h[$2] = $3. Затем пройдите file1 и выведите все три столбца $1,$2,$3, добавив соответствующий сохраненный столбец из хэш-массива h[$2].

ответил grebneke 7 FebruaryEurope/MoscowbFri, 07 Feb 2014 00:30:42 +0400000000amFri, 07 Feb 2014 00:30:42 +040014 2014, 00:30:42
6

Если вам не нужен заказ, чем простое решение будет

paste file{1,2} | awk '{print $1,$2,$3,$6}' > file3

Это предполагает, что все строки имеют три записи, а столбцы 1 и 2 обоих файлов одинаковы (как в данных примера)

ответил Bernhard 7 FebruaryEurope/MoscowbFri, 07 Feb 2014 00:40:31 +0400000000amFri, 07 Feb 2014 00:40:31 +040014 2014, 00:40:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132