数値テーブルがあります。つまり、すべてのセルに数字があります。数値ではなく、ヘッダーと行名を持つタブ区切りファイル。合計がゼロになるすべての列を削除する必要があります。最初の列(行名)と削除されていない残りの列のヘッダーを保持したいと思います。
入力する
a b c d
e 1 2 0
f 3 4 0
g 5 6 0
出力
a b c
e 1 2
f 3 4
g 5 6
同様の質問ですが、次の行があります。合計がゼロの行を削除
アッ解決策は良いでしょう。 Rから大容量ファイルをロードするのを避けたいです。
ベストアンサー1
削除する柱
奇妙な:
{ for(i=1;i<=NF;i++) { line[NR][i]=$i ; col[i]+=$i ;} }
END {
for ( l=1 ; l<=NR ; l++ )
{
printf line[l][1] "\t" ;
for (c=2;c<=NF;c++) if (col[c]) printf line[l][c] "\t" ;
printf "\n" ;
}
}
どこ
{ for(i=1;i<=NF;i++) { line[NR][i]=$i ; col[i]+=$i ;} }
すべての行(列名を含む)を保存します。END
count != 0 の場合、句はすべての列を印刷します。- すべてのデータはメモリに保存されます。
テスト:
awk -f c.awk a
a b c
e 1 2
f 3 4
g 5 6
ラインソリューションの場合...
努力する
awk 'NR==1 {print } NR>1 { s=0 ; for(i=1;i<=NF;i++) s+=$i ; if (s) print ;}'
どこ
NR==1 {print }
タイトル印刷NR>1 { s=0 ; for(i=1;i<=NF;i++) s+=$i ; if (s) print ;}
0かどうかテストし、そうでなければ印刷i=2
最初の列が行名であれば、それから始めることができます。- 浮動小数点数に注意してください。その合計がゼロではない可能性があります。
これにより、元のファイルから行を削除するのではなく、その行が出力されます。