我有一张类似下面的表格(但更长):
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做的方法)。
答案 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
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