簡體   English   中英

如何使用awk計算列中負值和正值的出現?

[英]How to count the occurence of negative and positive values in a column using awk?

我有一個看起來像這樣的文件:

FID IID data1 data2 data3 
1   RQ00001-2   1.670339    -0.792363849    -0.634434791    
2   RQ00002-0   -0.238737767    -1.036163943    -0.423512414
3   RQ00004-9   -0.363886913    -0.98661685 -0.259951265
3   RQ00004-9   -9  -0.98661685 0.259951265

我想計算第 3 列(數據 1)中正數的數量與不包括 -9 的負數。 因此,對於第 3 列,它將是 1 正對 2 負。 我沒有包括 -9 因為這代表缺失數據。 對於 data2,這將是 3 個負數對 1 個正數。 對於最后一列,它將是 3 負對 1 正。

我最好喜歡使用 awk,但由於我是新手,所以我需要幫助。 我使用下面的命令,但這只是計算所有 - 值,但我需要它來排除 -9。 有沒有更復雜的方法來做到這一點?

awk '$3 ~ /^-/{cnt++} END{print cnt}' filename.txt

您可以使用此awk解決方案:

awk -v c=3 '
NR > 1 && $c != -9 {
   if ($c < 0)
      ++neg
   else
      ++pos
}
END {
   printf "Positive: %d, Negative: %d\n", pos, neg
}' file

Positive: 1, Negative: 2

使用c=5運行它:

awk -v c=5 'NR > 1 && $c != -9 {if ($c < 0) ++neg; else ++pos} END {printf "Positive: %d, Negative: %d\n", pos, neg}' file

Positive: 1, Negative: 3
$ awk '
NR == 1 {
  for(i = 3; i <= NF; i++) header[i] = $i
}
NR > 1 {
  for(i = 3; i <= NF; i++) {
    pos[i] += ($i >= 0); neg[i] += (($i != -9) && ($i < 0))
  }
}
END {
  for(i in pos) {
    if (header[i] == "") header[i] = "column " i
    printf("%-10s: %d positive, %d negative\n", header[i], pos[i], neg[i])
  }
}' file
data1     : 1 positive, 2 negative
data2     : 0 positive, 4 negative
data3     : 1 positive, 3 negative

假設:

  • 確定第 3 到第 N 列的負值和正值的數量

一個awk的想法:

awk '
NR>1  { for (i=3;i<=NF;i++) {
                 if ($i == -9) continue
            else if ($i <   0) neg[i]++
            else               pos[i]++
        }
      }
END   { printf "Neg/Pos"
        for (i=3;i<=NF;i++)
            printf "%s%s/%s",OFS,neg[i]+0,pos[i]+0
        print ""
      }
' filename.txt

這會產生:

Neg/Pos 2/1 4/0 3/1

注意: OP 沒有提供預期輸出的示例; 所有計數都位於數組中,因此一旦 OP 提供了示例輸出,修改輸出格式應該相對容易

awk '
NR > 1 && $3 != -9 {$3 >= 0 ? ++p : ++n}
END {print "pos: "p+0, "neg: "n+0}'

給出:

pos: 1 neg: 2

您可以將++n更改為--p以獲得單個數字p ,等於正數減去負數。

您可以在下面找到一些如何實現此目的的示例:

注意:我們假設-0.00.0是正數。

計算列n中的負數:

$ awk '(FNR>1){c+=($n<0)}END{print "pos:",(NR-1-c),"neg:"c+0}' file

計算列n中的負數,但忽略-9

$ awk '(FNR>1){c+=($n<0);d+=($n==-9)}END{print "pos:",(NR-1-c-2*d),"neg:"c-d}' file

計算負數列 m 到 n:

$ awk '(FNR>1){for(i=m;i<=n;++i) c[i]+=($i<0)}
       END{for(i=m;i<=n;++i) print i,"pos:",(NR-1-c[i]),"neg:"c[i]+0}' file

計算 m 到 n 列中的負數,但忽略-9

$ awk '(FNR>1){for(i=m;i<=n;++i) {c+=($i<0);d+=($i==-9)}}
       END{for(i=m;i<=n;++i) print i,"pos:",(NR-1-c[i]-2*d[i]),"neg:"c[i]-d[i]}' file

暫無
暫無

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

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