完全匹配后 2 列中的部分匹配

Partial matches in 2 columns following exact match

我需要先进行 exact 匹配,然后进行 partial 匹配,然后从两列中检索字符串。理想情况下,我想用 awk.

来做到这一点

输入:

k141_18046_1    k141_18046_1
k141_18046_1    k141_18046_2
k141_18046_2    k141_18046_1
k141_12033_1    k141_18046_2
k141_12033_1    k141_12033_1
k141_12033_2    k141_12033_2
k141_2012_1     k141_2012_1
k141_2012_1     k141_2012_2
k141_2012_2     k141_2012_1
k141_21_1     k141_2012_2
k141_21_1       k141_21_1
k141_21_2       k141_21_2

预期输出:

k141_18046_1    k141_18046_2
k141_18046_2    k141_18046_1
k141_2012_1     k141_2012_2
k141_2012_2     k141_2012_1

在两列中,ID 的第一部分相同。我需要获取 ID_1 && ID_2 (OR) ID_2 && ID_1 出现在一行中的 ID。

谢谢, 苏希尔

根据评论更新:

$ awk '
!= {                     # consider only unequal strings
    n=split(,a,/_/)        # split them by undescored
    m=split(,b,/_/)
    if(m==n) {               # there should be equal amount of parts
        for(i=1;i<n;i++)  
            if(a[i]!=b[i])   # all but last parts should equal
                next         # or not valid
    } else
        next
    print                    # if you made it so far...
}' file

输出:

k141_18046_1    k141_18046_2
k141_18046_2    k141_18046_1
k141_2012_1     k141_2012_2
k141_2012_2     k141_2012_1

另一个awk,使用match()

$ awk '
substr(,match(,/^.*_/),RLENGTH) == substr(,match(,/^.*_/),RLENGTH) && 
substr(,match(,/[^_]*$/),RLENGTH) != substr(,match(,/[^_]*$/),RLENGTH)
' file