Я думаю, что это делает то, что вы хотите с awk
:
awk '
FNR==1 { next}
FNR==NR { chr[FNR]=$1; start[FNR]=$2; end[FNR]=$3; det[FNR]=$4; N=FNR; next}
{ c=$1; p=$2;
for(i=2;i<=N;i++){
if((c==chr[i]) && (p>=start[i]) && (p<=end[i])){
print c, p, chr[i], start[i], end[i], det[i]
next
}
}
}
' file2 file1
Итак, сначала обратите внимание на последнюю строку, что один вызов awk
обрабатывает оба файла.
Внутри обработки первая строка каждого файла игнорируется, проверяя, равен ли номер строки в текущем файле 1, и пропуская, если так:
FNR==1 { next}
Затем, если номер записи в текущем файлеравно общему количеству записей, обработанных awk
, следовательно, мы должны читать первый файл.Поэтому мы сохраняем каждое поле в массиве, проиндексированном по номеру строки, и избегаем дальнейшей обработки:
FNR==NR { chr[FNR]=$1; start[FNR]=$2; end[FNR]=$3; det[FNR]=$4; N=FNR; next}
В противном случае мы должны обрабатывать второй файл.В этом случае мы перебираем все массивы, которые мы сохранили из первого файла, чтобы найти подходящую запись.Если мы находим один в правильном диапазоне, мы печатаем нужные вам биты и кусочки и сразу переходим к следующей записи:
{ c=$1; p=$2;
for(i=2;i<=N;i++){
if((c==chr[i]) && (p>=start[i]) && (p<=end[i])){
print c, p, chr[i], start[i], end[i], det[i]
next
}
}
}