объединить два файла на основе двух столбцов - PullRequest
9 голосов
/ 12 сентября 2011

Верьте или нет, я искал по всему Интернету и не нашел работающего решения этой проблемы в AWK.

У меня есть два файла, A и B:

Файл A:

chr1   pos1   
chr1   pos2
chr2   pos1
chr2   pos2

Файл B:

chr1 pos1
chr2 pos1
chr3 pos2

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

chr1 pos1
chr2 pos1

Я хотел бы объединить эти два файла, чтобы получитьпересечение двух файлов на основе первого и второго столбцов, а не только первого.Поскольку дело обстоит именно так, большинство простых сценариев не будут работать, и объединение не представляется возможным.

Есть идеи?

РЕДАКТИРОВАТЬ: извините, я не упомянул, что тамбольше столбцов, чем только два, которые я показал.Я показал только два в моем примере, потому что меня интересуют только первые два столбца между обоими файлами, которые идентичны, остальные данные не важны (но, тем не менее, находятся в файле)

Ответы [ 4 ]

10 голосов
/ 12 сентября 2011

Гм, моя идея заключается в следующем: используйте join, чтобы объединить два файла и исправить с помощью awk

$ join  A B 
chr1 pos1 pos1
chr1 pos2 pos1
chr2 pos1 pos1
chr2 pos2 pos1

$ join  A B | awk '{ if ($2==$3) printf("%s %s\n", $1, $2) }'
chr1 pos1 pos1
chr2 pos1 pos1

Редактировать: при редактировании решение по объединению может все еще работать (с опциями),таким образом, концепция остается верной (IMO).

4 голосов
/ 12 сентября 2011

Решение awk:

awk 'FILENAME==ARGV[1] {pair[$1 " " $2]; next} ($1 " " $2 in pair)' fileB fileA

Сначала поместите файл меньшего размера, так как вы должны в основном хранить его в памяти.

2 голосов
/ 13 сентября 2011

Я бы написал так:

awk 'NR == FNR {
  k[$1, $2]
  next
  }
($1, $2) in k
  ' filea fileb  

Порядок ввода файлов может потребоваться адаптировать с учетом точных требований.

1 голос
/ 12 сентября 2011

Почему бы не просто grep -f как это:

grep -f fileB fileA

РЕДАКТИРОВАТЬ:

Для файлов, имеющих более 2 столбцов, попробуйте это:

grep "$(cut -d" " -f1,2 fileB)" fileA | cut -d" " -f1,2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...