2016-08-29 17 views
0

次の形式のテーブルがあります。 > 500列と113行が存在し、column1は識別子です。エントリの値の90%以上が1より大きい識別子のみを持つ、つまり値の> 90%が1より大きい場合、A1の場合、つまり、1より大きいエントリの総数を最後の列を保持してください。どんな提案もお願いします。行内の1より大きい数字の出現回数をカウントする

Id M1 M2 M3 M4 M5 M6 A1 0.82 0.73 1.40 0.52 1.84 3.20 A2 14.44 23.73 55.27 68.77 14.18 0.05 A3 5.56 5.69 10.46 10.55 7.49 7.77 A4 1.06 3.62 1.68 1.38 1.90 6.64 A5 0.01 0.00 0.03 0.01 0.00 0.07 A6 0.07 0.72 27.68 19.70 2.33 0.00 A7 5.57 8.95 18.71 6.75 16.76 33.66 A8 0.86 2.30 1.65 0.92 2.01 0.92 A9 20.21 25.59 25.86 21.62 26.75 24.66 A10 28.05 28.26 22.48 27.41 32.28 26.94 A11 0.22 0.83 7.39 5.88 2.05 9.27 A12 13.90 19.43 28.51 25.48 21.44 29.24 A13 15.43 18.39 12.49 14.75 15.79 10.85 A14 3.92 13.00 14.13 8.18 13.92 23.83 A15 0.06 0.02 0.01 0.01 0.04 0.03 A16 0.99 2.46 6.08 4.56 3.81 3.43 A17 1.31 2.05 3.18 1.73 2.80 4.12 A18 3.60 7.90 8.57 5.56 7.18 12.20 A19 44.82 47.53 37.16 42.20 41.51 26.33 A20 1.59 2.88 2.55 3.05 3.08 2.88

私は非常に限られた知識を持っています。私はこのawk '$0=$0OFS NF-1' FS=1.40との正確な一致をカウントする方法を知っていますが、それ以上の条件はありません。

私は主に次の形式で出力します。最後の列は、エントリ数> 1を示します。

Id M1 M2 M3 M4 M5 M6
A1 0.82 0.73 1.40 0.52 1.84 3.20 3 A2 14.44 23.73 55.27 68.77 14.18 0.05 5 A3 5.56 5.69 10.46 10.55 7.49 7.77 6 A4 1.06 3.62 1.68 1.38 1.90 6.64 6 A5 0.01 0.00 0.03 0.01 0.00 0.07 0 A6 0.07 0.72 27.68 19.70 2.33 0.00 3 A7 5.57 8.95 18.71 6.75 16.76 33.66 6 A8 0.86 2.30 1.65 0.92 2.01 0.92 3 A9 20.21 25.59 25.86 21.62 26.75 24.66 6 A10 28.05 28.26 22.48 27.41 32.28 26.94 6 A11 0.22 0.83 7.39 5.88 2.05 9.27 4 A12 13.90 19.43 28.51 25.48 21.44 29.24 6 A13 15.43 18.39 12.49 14.75 15.79 10.85 6 A14 3.92 13.00 14.13 8.18 13.92 23.83 6 A15 0.06 0.02 0.01 0.01 0.04 0.03 0 A16 0.99 2.46 6.08 4.56 3.81 3.43 5 A17 1.31 2.05 3.18 1.73 2.80 4.12 6 A18 3.60 7.90 8.57 5.56 7.18 12.20 6 A19 44.82 47.53 37.16 42.20 41.51 26.33 6 A20 1.59 2.88 2.55 3.05 3.08 2.88 6

+0

カラムに名前を追加してください。 – Daniel

+0

あなたの質問には、入力とそれまでに試したもの(つまり[mcve]を完成したもの)を加えた予想出力を含めてください。 –

答えて

1
$ awk '{for(i=1;i<=NF;i++) {if($i+0>1) c++; printf "%-5s%s", $i, (i==NF? OFS c ORS: OFS)}c=0}' file 
Id M1 M2 M3 M4 M5 M6 
A1 0.82 0.73 1.40 0.52 1.84 3.20 3 
A2 14.44 23.73 55.27 68.77 14.18 0.05 5 
A3 5.56 5.69 10.46 10.55 7.49 7.77 6 
A4 1.06 3.62 1.68 1.38 1.90 6.64 6 
A5 0.01 0.00 0.03 0.01 0.00 0.07 0 
A6 0.07 0.72 27.68 19.70 2.33 0.00 3 
A7 5.57 8.95 18.71 6.75 16.76 33.66 6 
A8 0.86 2.30 1.65 0.92 2.01 0.92 3 
A9 20.21 25.59 25.86 21.62 26.75 24.66 6 
A10 28.05 28.26 22.48 27.41 32.28 26.94 6 
A11 0.22 0.83 7.39 5.88 2.05 9.27 4 
A12 13.90 19.43 28.51 25.48 21.44 29.24 6 
A13 15.43 18.39 12.49 14.75 15.79 10.85 6 
A14 3.92 13.00 14.13 8.18 13.92 23.83 6 
A15 0.06 0.02 0.01 0.01 0.04 0.03 0 
A16 0.99 2.46 6.08 4.56 3.81 3.43 5 
A17 1.31 2.05 3.18 1.73 2.80 4.12 6 
A18 3.60 7.90 8.57 5.56 7.18 12.20 6 
A19 44.82 47.53 37.16 42.20 41.51 26.33 6 
A20 1.59 2.88 2.55 3.05 3.08 2.88 6 

{ 
    for(i=1;i<=NF;i++) {        # for each field 
     if($i+0>1) c++        # if field > 1, count 
     printf "%-5s%s", $i, (i==NF? OFS c ORS: OFS) # output nicely 
    } 
    c=0            # reset counter 
} 
+1

これは、 'print $ 0'から' printf'に切り替える前の古いバージョンから残っていました。削除されました、ありがとう。 –

1
$ awk 'NR>1{$0=$0"\t"NF-gsub(/^.|[[:space:]]0\./,"&")} 1' file 
Id M1 M2 M3 M4 M5 M6 
A1 0.82 0.73 1.40 0.52 1.84 3.20  3 
A2 14.44 23.73 55.27 68.77 14.18 0.05  5 
A3 5.56 5.69 10.46 10.55 7.49 7.77  6 
A4 1.06 3.62 1.68 1.38 1.90 6.64  6 
A5 0.01 0.00 0.03 0.01 0.00 0.07  0 
A6 0.07 0.72 27.68 19.70 2.33 0.00  3 
A7 5.57 8.95 18.71 6.75 16.76 33.66  6 
A8 0.86 2.30 1.65 0.92 2.01 0.92  3 
A9 20.21 25.59 25.86 21.62 26.75 24.66  6 
A10 28.05 28.26 22.48 27.41 32.28 26.94  6 
A11 0.22 0.83 7.39 5.88 2.05 9.27  4 
A12 13.90 19.43 28.51 25.48 21.44 29.24  6 
A13 15.43 18.39 12.49 14.75 15.79 10.85  6 
A14 3.92 13.00 14.13 8.18 13.92 23.83  6 
A15 0.06 0.02 0.01 0.01 0.04 0.03  0 
A16 0.99 2.46 6.08 4.56 3.81 3.43  5 
A17 1.31 2.05 3.18 1.73 2.80 4.12  6 
A18 3.60 7.90 8.57 5.56 7.18 12.20  6 
A19 44.82 47.53 37.16 42.20 41.51 26.33  6 
A20 1.59 2.88 2.55 3.05 3.08 2.88  6 

gsub()開始番号以外のライン上のすべての数をカウントし、それが行の最初の文字で正規表現の試合でした回数のカウントを返し^.0.で始まる任意の番号が一致したので、 1.以上。次に、合計行数NFから戻り値gsub()を減算して、各行で1より大きい数のカウントを取得します。

関連する問題