[英]awk or shell command to count occurence of value in 1st column based on values in 4th column
[英]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
假設:
一個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.0
和0.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.