选择包含共享值

时间:2016-07-05 09:54:35

标签: shell awk

我有一张类似下面的表格(但更长):

A     B        C          D           E
1     YRI_1    YRI_2      10761       0  
2     YRI_3    YRI_3      7825        0  
3     YRI_1    YRI_4      9880        0  
4     YRI_1    Medit_1    79707       0  
5     YRI_2    Medit_2    73865       0  
6     YRI_2    Medit_3    77165       0  
7     YRI_3    Medit_4    76428       0  
8     YRI_3    CHB_1      8273        0  
9     YRI_2    CHB_2      10668       0  
10    YRI_1    CHB_3      8391        0

我想获得:

A     B        C          D           E
2     YRI_3    YRI_3      7825        0
4     YRI_1    Medit_1    79707       0  
5     YRI_2    Medit_2    73865       0  
9     YRI_2    CHB_2      10668       0

即。我想保留那些列B和C中的数字只匹配的行,例如YRI_1 / Medit_1都有" 1"所以这是一个想要的行,但我不想保留例如YRI_1 / Medit_10,因为这是" 10"虽然它包含" 1"。

我试过用awk:

for i in {1..4}
do
   awk '$2=="*$i"||$3=="*$i" {print $1,$2,$3,$4,$5}' table > desired_table
done

其中$ i应该在每次迭代中被列表1..4中的下一个数字替换,并且我假装*表示任何意思,因为我对数字感兴趣(但我想这不是用awk做的方法)。

2 个答案:

答案 0 :(得分:3)

您可以使用此awk命令:

awk 'split($2, a, /_/) && split($3, b, /_/) && a[2] == b[2]' file

A     B        C          D           E
2     YRI_3    YRI_3      7825        0
4     YRI_1    Medit_1    79707       0
5     YRI_2    Medit_2    73865       0
9     YRI_2    CHB_2      10668       0
  • 我们使用2个split函数来拆分$2$3,然后比较split数组的第二个字段是否相等。
  • split返回结果数组中的元素数。使用awk 'split($2, a, /_/) && split($3, b, /_/) &&,我们确保split返回非零值。

答案 1 :(得分:1)

从相关的cols中删除除数字([^ 0-9])以外的所有字符,如果匹配则打印。

awk 'NR==1 || (gensub(/[^0-9]/,"","g",$2)==gensub(/[^0-9]/,"","g",$3))' file
A     B        C          D           E
2     YRI_3    YRI_3      7825        0
4     YRI_1    Medit_1    79707       0
5     YRI_2    Medit_2    73865       0
9     YRI_2    CHB_2      10668       0