2

次のようなファイルがあります。

C1 C2 C3 C4 C5
0 0 0 0 0
0 1 0 0 0
0 0 0 1 0
0 0 0 0 0

しかし、はるかに大きい...

すべて 0 の列のみを抽出したいので、出力ファイルは次のようになります。

C1 C3 C5
0 0 0
0 0 0
0 0 0
0 0 0

これは単純な awk ワンライナーで実行できますか (awk に似ています:たとえば、別の列の値に基づいて列を印刷します)。いいえの場合、bash を使用してこれを効果的に行う別の方法はありますか?

4

3 に答える 3

1

すごい解決策。
列を行に変換

awk '{
       for (f = 1; f <= NF; f++) { a[NR, f] = $f }
     }
     NF > nf { nf = NF }
     END {
       for (f = 1; f <= nf; f++) {
           for (r = 1; r <= NR; r++) {
               printf a[r, f] (r==NR ? RS : FS)
           }
       }
    }' file >tmp1

のみの行のみを印刷する0

awk '{for (i=2;i<=NF;i++) f+=$i} !f; {f=0}' tmp1 >tmp2

元に戻す

awk '{
       for (f = 1; f <= NF; f++) { a[NR, f] = $f }
     }
     NF > nf { nf = NF }
     END {
       for (f = 1; f <= nf; f++) {
           for (r = 1; r <= NR; r++) {
               printf a[r, f] (r==NR ? RS : FS)
           }
       }
    }' tmp2

与える

C1 C3 C5
0 0 0
0 0 0
0 0 0
0 0 0
于 2013-11-14T10:13:21.097 に答える