ฉันกำลังพยายามค้นหาว่าตัวเลข range1 [ทั้งคอลัมน์ a และ b] เป็นส่วนย่อยหรืออยู่ระหว่างคอลัมน์ของ range2 [ทั้งสองคอลัมน์ b และ c]
ช่วง1
ก ข
15 20
8 10
37 44
32 37
ช่วง2
เอ บี ซี
chr1 6 12
chr2 13 21
chr3 31 35
chr4 36 45
เอาต์พุต:
เอ บี ซี
chr1 6 12 8 10
chr2 13 21 15 20
chr4 36 45 37 44
ฉันพยายามเรียนรู้จากรหัสนี้ [ซึ่งใช้งานได้หากเราต้องการตรวจสอบว่ามีตัวเลขเดียวอยู่ในช่วงที่กำหนดหรือไม่] ดังนั้นฉันจึงลองแก้ไขตัวเลขเดียวกันสำหรับสองตัวเลขทั้งสอง แต่ไม่ได้ผล ฉันรู้สึกว่าฉันไม่สามารถอ่านไฟล์ที่สองได้อย่างถูกต้อง
ฉันต้องการเปรียบเทียบ range1[a] กับ range2[b] และ range1[b] กับ range2[c] การเปรียบเทียบแบบหนึ่งต่อทั้งหมด
ตัวอย่างเช่น ในการรันครั้งแรก: แถวแรกของช่วง -1 กับแถวอื่นทั้งหมดของช่วง -2แต่ควรเปรียบเทียบ range1[a] กับ range2[b] เท่านั้น และในทำนองเดียวกัน range1[b] ควรเปรียบเทียบกับ range2[c] เท่านั้น จากนี้ฉันได้เขียนเกณฑ์เท่านั้น:
ปอนด์[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= ปอนด์[i] && ubsf1[j] <= ubs[i]
r1[a] r2[b] r1[b] r2[ค]
15 > 6 20 < 12 ผิด
15 > 13 20 < 21 จริง
15 > 31 20 < 35 ผิด
15 > 36 20 < 45 ผิด
รหัส: [อ้างอิง แต่แก้ไขเล็กน้อย]
#!/bin/bash
awk -F'\t' '
# 1st pass (fileB): อ่านขอบเขตล่างและบน
FNR==NR { ปอนด์[++นับ] = $2+0; ubs[นับ] = $3+0; ต่อไป }
# 2nd pass (fileA): ตรวจสอบแต่ละบรรทัดเทียบกับทุกช่วง
{ lbsf1[++countf1] = $1+0; ubsf1[countf1] = $2+0; ต่อไป }
{
สำหรับ (i=1;i<=count;++i)
{
สำหรับ (j=1;j<=countf1;++j)
ถ้า (lbsf1[j] >= lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i])
{ พิมพ์ lbs[i]"\t"ubs[i]"\t"lbsf1[j]"\t"ubsf1[j] ; ต่อไป }
}
}
' เรนจ์2 เรนจ์1
ขอขอบคุณ.