grep сопоставляет поля для шаблона в двух файлах

Использование сортировки в качестве основного инструмента:

sort             ifile.dat -k1,1 -k2,2nr | sort -uk1,1 | awk '{print $1,$2}' \
| paste - <(sort ifile.dat -k1,1 -k3,3nr | sort -uk1,1 | awk '{print $3}')
2
25.09.2019, 18:30
3 ответа

Вы не можете сделать это в grep, нет. Хотя вы можете использовать файл с шаблонами для поиска в качестве входных данных для grep, вы не можете указать конкретное поле в этом файле. Итак, если вы хотите сопоставить только 2-е позиции, вам понадобится что-то вроде этого:

$ awk  '{ if(NR==FNR){a[$2]=$0}else{if($2 in a){print}}}' file1.vcf file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

Конечно, это также напечатает случаи, когда положение такое же, но вариант находится на другой хромосоме. Это то, о чем спрашивал ваш вопрос, но может иметь смысл искать уникальные комбинации chr и pos:

$ awk  '{ if(NR==FNR){a[$1$2]=$0}else{if($1$2 in a){print}}}' file1.vcf file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

Чтобы сделать это с grep, вам нужно сначала извлечь поле POS в новый файл:

awk '{print $2}' file1.vcf > file3
$ cat file3
POS
10366
10611
51954
13327
13957
13980

Теперь используйте этот файл сgrep:

$ grep -f file3 file2.vcf 
#CHROM  POS ID  REF ALT QUAL    
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   

Но это действительно не очень хорошая идея. Например, он также найдет совпадение для 1103668 since10366 is a substring of1103668 `.


Наконец, предполагая, что это два действительных файла vcf (, которых нет в ваших примерах ), вы можете использовать bedtools intersect. Но это не совсем в тему здесь.

0
27.01.2020, 22:24

Используйтеgrep:

$ grep -Fof file1 file2
    #CHROM  POS ID  REF ALT QUAL
1   10366   rs58108140  G   A   
1   51954   rs185832753 G   C   
  • -Fиспользуйте фиксированные строки вместо регулярных выражений
  • -oтолько соответствие печати
  • -f file1поиск всех шаблонов/фиксированных строк, по одному на каждую строкуfile1
  • file2файл для поиска этих

Альтернативное использованиеawk:

awk '
    NR==FNR{s[$0]=1}
    NR!=FNR && s[$0]
' file1 file2
0
27.01.2020, 22:24

Если какая-либо часть «соответствующей» строки (, включая расстояние между полями ), может изменяться между двумя файлами, тогда joinбудет лучшим инструментом для этой работы.

sort -n -k 2 < file1 > sort1
sort -n -k 2 < file2 > sort2
join --header -1 2 -2 2 -o '1.1 1.2 1.3 1.4 1.5'  sort1 sort2

Шаги sortнеобходимы, потому что joinтребует, чтобы его ввод был отсортирован (по общему полю ).

Результат:

#CHROM POS ID REF ALT
1 10366 rs58108140 G A
1 51954 rs185832753 G C
0
27.01.2020, 22:24

Теги

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