簡體   English   中英

計算一行中的零個數,將計數添加到新列

[英]Counting number of zeros in a row, adding count to new column

我有一個制表符分隔的表格,如下所示:

chr1 100 110 + 2 3 0 8 6
chr1 150 200 + 1 4 0 2 0
chr1 200 220 + 1 4 2 0 0
chr1 250 260 + 4 2 6 1 3

我想計算第 5-9 列中有多少個零並將該數字添加到第 10 列:

chr1 100 110 + 2 3 0 8 6 1
chr1 150 200 + 1 4 0 2 0 2
chr1 200 220 + 1 4 2 0 0 2
chr1 250 260 + 4 2 6 1 3 0

最終,目標是僅對那些不超過 4 個零的行進行子集化(至少 2 列非零)。 我知道如何用awk做這個子集,但我不知道如何計算這些列中的零。 如果有一種更簡單的方法只要求在第 5-9 列之間至少有兩列非零,那將是理想的。

此腳本計算零並將它們附加為最后一列:

awk '{
  cnt=0
  for (i=5;i<=9;i++) {
    cnt+=($i==0)
  }
  print $0, cnt
}' inputs.txt

請注意,如果條件為真,則$i==0產生 1,否則產生 0。 因此,這可以用作計數器的增量。

rethab 的回答完美地滿足了您添加額外列的第一個要求。 這滿足了您的第二個要求(僅打印少於 4 個零的行)。 使用 awk(使用 GNU awk 測試),只需計算字段 5 和字段 9(變量nz )之間的非零字段,並且僅在大於或等於 2 時打印:

$ cat foo.txt
chr1 100 110 + 2 3 0 8 6
chr1 150 200 + 1 4 0 2 0
chr1 250 260 + 0 0 0 1 0
chr1 200 220 + 1 4 2 0 0
chr1 250 260 + 4 2 6 1 3
$ awk '{nz=0; for(i=5;i<=9;i++) nz+=($i!=0)} nz>=2' foo.txt
chr1 100 110 + 2 3 0 8 6
chr1 150 200 + 1 4 0 2 0
chr1 200 220 + 1 4 2 0 0
chr1 250 260 + 4 2 6 1 3

您可以使用gsub返回每行的替換數(此處為每個s字符串),然后打印該數字:

awk '{s=$5$6$7$8$9;x=gsub(/0/,"&",s);print $0, x}' file
chr1 100 110 + 2 3 0 8 6 1
chr1 150 200 + 1 4 0 2 0 2
chr1 200 220 + 1 4 2 0 0 2
chr1 250 260 + 4 2 6 1 3 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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