Awk 完全匹配后的两列中的部分匹配
我需要进行Awk 完全匹配后的两列中的部分匹配,awk,string-matching,Awk,String Matching,我需要进行精确匹配,然后进行部分匹配,并从两列中检索字符串。理想情况下,我希望使用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_2
精确匹配,然后进行部分匹配,并从两列中检索字符串。理想情况下,我希望使用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(或)ID_2&&ID_1出现在一行中的ID
谢谢,,
Susheel根据评论更新:
$ awk '
$1!=$2 { # consider only unequal strings
n=split($1,a,/_/) # split them by undescored
m=split($2,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
另一个awk,使用match()
对不起,我的错。。输入文件有其他未在前面定义的ID匹配,我将更新输入说明。非常抱歉!对不起,我编辑了我的原始样本描述。我也有这样的值:k141\u13612\u2k141\u5573\u1
和k141\u13612\u2k141\u19887\u1
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 '
substr($1,match($1,/^.*_/),RLENGTH) == substr($2,match($2,/^.*_/),RLENGTH) &&
substr($1,match($1,/[^_]*$/),RLENGTH) != substr($2,match($2,/[^_]*$/),RLENGTH)
' file