Использование сортировки в качестве основного инструмента:
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}')
Вы не можете сделать это в 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 since
10366 is a substring of
1103668 `.
Наконец, предполагая, что это два действительных файла vcf (, которых нет в ваших примерах ), вы можете использовать bedtools intersect
. Но это не совсем в тему здесь.
Используйте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
Если какая-либо часть «соответствующей» строки (, включая расстояние между полями ), может изменяться между двумя файлами, тогда 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