计算连续大于1的数字的出现次数

时间:2016-08-29 23:57:10

标签: awk

我有以下格式的表格。存在> 500列和113行,其中column1是标识符。我想只有那些> 90%的条目值大于1的那些标识符,即对于A1,如果> 90%的值大于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

2 个答案:

答案 0 :(得分: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 :(得分: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.或更高开头的数字之外,该行上的每个数字。然后,只需从字段总数gsub()中减去NF返回值,即可得到每行大于1的数字。