簡體   English   中英

用於選擇具有共享值的列的行的awk

[英]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
  • 我們使用2個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM