[英]Awk for selecting rows with columns that share a value
我有一張類似下面的表(但更長):
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)。
你可以使用這個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
正在返回非零值。 從相關的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.