![当所有列都小于一时如何删除一行](https://linux22.com/image/1166886/%E5%BD%93%E6%89%80%E6%9C%89%E5%88%97%E9%83%BD%E5%B0%8F%E4%BA%8E%E4%B8%80%E6%97%B6%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E4%B8%80%E8%A1%8C.png)
我有一个矩阵文件
a 0.34 3.03 1.92
b 1.35 1.34 0.63
c 0.66 2.32 1.01
d 0.23 2.07 0.22
e 0.34 0.47 0.55
我必须删除列中所有值都小于 1 的行。
预期输出文件为
a 0.34 3.03 1.92
b 1.35 1.34 0.63
c 0.66 2.32 1.01
d 0.23 2.07 0.22
我得到这个链接,当所有列都小于零时,它们会删除行https://stackoverflow.com/questions/20592611/how-to-delete-rows-where-all-the-columns-are-zero,他们在 R 中使用行总和。但我不认为在这种情况下行总和会起作用。
答案1
要排除所有(数字)列值小于 1 的行,请打印至少有一列的值大于或等于 1 的行:
$ awk '{for(i=2;i<=NF;i++) if($i >= 1){print; next}}' file
a 0.34 3.03 1.92
b 1.35 1.34 0.63
c 0.66 2.32 1.01
d 0.23 2.07 0.22
或者
perl -alne 'shift @F; print if grep { $_ >= 1 } @F' file
或者(更明确地说,使用any
List::Util 模块)
perl -MList::Util=any -alne 'shift @F; print if any { $_ >= 1 } @F' file
您建议的 R 命令(发表在评论中) 很接近:我认为它失败了,因为您没有排除第一列(非数字)例如。
> dat = read.table("file")
>
> dat
V1 V2 V3 V4
1 a 0.34 3.03 1.92
2 b 1.35 1.34 0.63
3 c 0.66 2.32 1.01
4 d 0.23 2.07 0.22
5 e 0.34 0.47 0.55
>
> dat[!apply(dat, 1, function(x) all(x < 1)), ]
V1 V2 V3 V4
1 a 0.34 3.03 1.92
2 b 1.35 1.34 0.63
3 c 0.66 2.32 1.01
4 d 0.23 2.07 0.22
5 e 0.34 0.47 0.55
>
但
> dat[!apply(dat[,-1], 1, function(x) all(x < 1)), ]
V1 V2 V3 V4
1 a 0.34 3.03 1.92
2 b 1.35 1.34 0.63
3 c 0.66 2.32 1.01
4 d 0.23 2.07 0.22
>