แถวทั่วไประหว่างไฟล์ข้อความ 2 ไฟล์ในบรรทัดคำสั่ง linux

ฉันมีไฟล์ข้อความ 2 ไฟล์ อันที่ 1 เป็นเช่นนี้:

DB  41533499    41533500    14
CD  41533500    41533501    3
AR  41533504    41533505    5
DR  41533506    41533507    3
AR  41533508    41533509    1
AR  48743349    48743350    1

และอันที่ 2 มีลักษณะดังนี้:

DB  41533400    41533600
DR  41533300    41533800
AR  41533200    41533800
AR  48743100    48743983

ความแตกต่างระหว่างคอลัมน์ที่ 2 และคอลัมน์ที่ 3 คือ 1 ซึ่งหมายความว่านั่นคือจุด ฉันต้องการสร้างไฟล์ใหม่โดยที่คอลัมน์ที่ 1 อยู่ร่วมกันระหว่าง 2 ไฟล์และช่วงของคอลัมน์ที่ 2 และ 3 ในไฟล์ 2 อยู่ในช่วงของคอลัมน์ที่ 2 และ 3 ใน file2 นี่คือผลลัพธ์ที่คาดหวัง:

DB  41533400    41533600    41533499    41533500    14
DR  41533300    41533800    41533506    41533507    3
AR  41533200    41533800    41533508    41533509    1
AR  48743100    48743983    48743349    48743350    1

ฉันกำลังพยายามทำในบรรทัดคำสั่ง linux และเขียนสิ่งต่อไปนี้ แต่ไม่ได้สิ่งที่ฉันต้องการ:

awk '{print $1 "\t" $2 "\t" $3 "\t" }' file2.txt '{print $1 "\t" $2 "\t" $3 "\t" $4 }' file1.txt > output.txt

คุณรู้วิธีแก้ไขมันไหม?


awk
person ARM    schedule 14.12.2017    source แหล่งที่มา
comment
อธิบายว่าทำไมรายการนี้ AR 41533504 41533505 5 จึงควรข้ามไป   -  person RomanPerekhrest    schedule 14.12.2017
comment
เนื่องจากไม่มีแถวที่ตรงกันในไฟล์ที่ 2   -  person ARM    schedule 14.12.2017
comment
นั่นฟังดูน่าสงสัย ...   -  person RomanPerekhrest    schedule 14.12.2017
comment
AR 41533504 41533505 พอดีกับ AR 41533200 41533800 ใน file2 ตามตรรกะที่คุณอธิบาย บางทีอาจมีข้อจำกัดอีกอย่างหนึ่งเช่นเอกลักษณ์?   -  person karakfa    schedule 14.12.2017


คำตอบ (2)


นี่คือหนึ่งสำหรับ GNU awk แต่ฉันแบ่งปัน คำถามเดียวกันกับ @RomanPerekhrest เกี่ยวกับบันทึก AR 41533504 41533505 5:

$ awk 'NR==FNR{
    a[$1][$2]=$3; next
}
($1 in a) {
    for(i in a[$1])
        if($2>=i && $3 <= a[$1][i])
            print $1,i,a[$1][i],$2,$3,$4
}' file2 file1
DB 41533400 41533600 41533499 41533500 14
AR 41533200 41533800 41533504 41533505 5
DR 41533300 41533800 41533506 41533507 3
AR 41533200 41533800 41533508 41533509 1
AR 48743100 48743983 48743349 48743350 1
person James Brown    schedule 14.12.2017

ตามการตีความข้อกำหนดฟรีของฉันตามแถวที่หายไป

ด้วยไปป์แทนที่จะเป็นสคริปต์ awk เดียว (ตอบแล้ว)

$ join <(sort file2) <(sort file1) | # sort and join on key (1st field)
  awk '$2<$4 && $3>$5'             | # apply within range logic
  sort -k6n                        | # sort ascending based on last field
  awk '!a[$2]++'                   | # pick first instance of 2nd field (the lowest) 
  tac                                # reverse to be in descending order


DB 41533400 41533600 41533499 41533500 14
DR 41533300 41533800 41533506 41533507 3
AR 48743100 48743983 48743349 48743350 1
AR 41533200 41533800 41533508 41533509 1
person karakfa    schedule 14.12.2017