RNAseqをしているが、行に5つくらいのデータがあって、それらすべてが0 の行を取り除きたいのだが、いい方法はないかと聞かれた。
列和であれば、$2 とかしてすぐに結果が出せるのはぐぐってよく出る。
しかし、行和をどうこうするのはなかなか出てこない。
というわけで、行がいくつあるかの変数 NF と、行についてfor を回して0 かどうかの論理判断をして、すべて0 だった場合は除外、そうでなければprint して残す、というif 文でゴリ押しする。
R のワンライナーで適当にinput.txt を作成する
R -q -e 'nr<-8;nc<-5;a<-matrix(runif(nr*nc,1,10),nr);a[3,]<-0;a[sample(seq(a), 6)]<-0;write.table(a,"input.txt",quote=F,col.names=F)'
cat input.txt
1 7.884 0 7.431 7.233 7.049 2 9.302 5.414 8.19 2.165 1.838 3 0 0 0 0 0 4 6.113 8.062 3.974 6.062 6.251 5 7.478 5.364 0 2.168 3.363 6 6.258 3.689 8.887 3.095 1.854 7 3.396 1.824 0 1.51 1.189 8 3.728 1.779 0 0 8.062
ここで、1列目には遺伝子名がはいっているらしく、行がすべて0 なのは3行目、あとはダミーで適当に0 のセルを作っている。
ということで、for は2列目から参照して、最後の列 NF まで回す。
その最中に、sum という箱を用意しておいて、真偽判定で真なら0、偽なら1 が入るように加算して、最終的にsum が0 かどうかを判定してprint するかどうか決める。
awk '{sum=0; for(i=2;i<=NF;i++){sum+=($i!=0)}; if(sum!=0) print $0}' input.txt
1 7.884 0 7.431 7.233 7.049 2 9.302 5.414 8.19 2.165 1.838 4 6.113 8.062 3.974 6.062 6.251 5 7.478 5.364 0 2.168 3.363 6 6.258 3.689 8.887 3.095 1.854 7 3.396 1.824 0 1.51 1.189 8 3.728 1.779 0 0 8.062
3行目だけ削除できた。