完全匹配后 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
我需要先进行 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