Tôi đang cố gắng tìm hiểu xem các số trong phạm vi 1 [cả hai cột a và b] là tập hợp con hay nằm giữa các cột của phạm vi 2 [cả hai cột b và c].
phạm vi1
một b
15 20
8 10
37 44
32 37
phạm vi2
một b c
chr1 6 12
chr2 13 21
chr3 31 35
chr4 36 45
đầu ra:
một b c
chr1 6 12 8 10
chr2 13 21 15 20
chr4 36 45 37 44
Tôi đã cố gắng học từ mã này [mã này đang hoạt động nếu chúng tôi muốn kiểm tra xem một số có nằm trong một phạm vi cụ thể hay không], do đó tôi đã thử sửa đổi mã tương tự cho cả hai số. Nhưng không hoạt động, tôi cảm thấy mình không thể đọc đúng tệp thứ hai.
Tôi muốn so sánh phạm vi1[a] với phạm vi2[b] và phạm vi1[b] với phạm vi2[c]. Một để tất cả so sánh.
Ví dụ: trong lần chạy đầu tiên: hàng đầu tiên của phạm vi-1 với tất cả các hàng khác của phạm vi-2.Nhưng phạm vi1[a] chỉ nên được so sánh với phạm vi2[b] và tương tự, phạm vi1[b] chỉ nên được so sánh với phạm vi2[c]. Chỉ dựa trên điều này, tôi đã viết một tiêu chí:
lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i]
r1[a] r2[b] r1[b] r2[c]
15 > 6 20 < 12 Sai
15 > 13 20 < 21 Đúng
15 > 31 20 < 35 Sai
15 > 36 20 < 45 Sai
Mã số: [thẩm quyền giải quyết nhưng ít sửa đổi]
#!/bin/bash
awk -F'\t' '
# 1st pass (fileB): đọc giới hạn phạm vi dưới và trên
FNR==NR { lbs[++count] = $2+0; ubs[count] = $3+0; tiếp theo }
# 2nd pass (fileA): kiểm tra từng dòng so với tất cả các phạm vi.
{ lbsf1[++countf1] = $1+0; ubsf1[countf1] = $2+0; tiếp theo }
{
for(i=1;i<=count;++i)
{
for(j=1;j<=countf1;++j)
if (lbsf1[j] >= lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i])
{ print lbs[i]"\t"ubs[i]"\t"lbsf1[j]"\t"ubsf1[j] ; tiếp theo }
}
}
' phạm vi2 phạm vi1
Cảm ơn bạn.