【问题标题】:Obtaining UNIQUE VALUE occurrences count in a set of COLUMNS using AWK使用 AWK 获取一组 COLUMNS 中的 UNIQUE VALUE 出现次数
【发布时间】:2015-06-29 16:57:51
【问题描述】:

忽略第 1 列和第 2 列(仅其余列);我想获取以下数据集的 UNIQUE EVEN 值(忽略 ODD 值)的出现次数。

我试过了:

awk '{ a[$3, $4, $5, $6, $7]++ } END { for (b in a) { cnt+=1 } {print cnt}}' file

我得到了 76,但我不期望这个值。

>         0 0 
>         1 0 0
>         2 0 2
>         3 0 0 6
>         4 0 0 8
>         5 0 0 10
>         6 0 2 14
>         7 0 2 16
>         8 0 0 6 20
>         9 0 0 8 24
>         10 0 0 8 26
>         11 0 0 10 32
>         12 0 0 10 34
>         13 0 2 14 40
>         14 0 2 16 42
>         15 0 0 8 24 48
>         16 0 0 8 24 50
>         17 0 0 8 26 56
>         18 0 0 10 32 60
>         19 0 0 10 34 64
>         20 0 0 10 34 66
>         21 0 2 14 40 72
>         22 0 0 8 24 48 76
>         23 0 0 8 24 50 82
>         24 0 0 8 26 56 88
>         25 0 0 8 26 56 90
>         26 0 0 10 32 60 96
>         27 0 0 10 32 60 98
>         28 0 0 10 34 64 104
>         29 0 0 10 34 64 106
>         30 0 0 10 34 66 112
>         31 0 0 10 34 66 114
>         0 1 
>         1 1 2 5
>         2 1 2
>         3 1 2 12 23 19
>         4 1 2 12 23
>         5 1 2 12
>         6 1 2 12 28
>         7 1 2 12 28 36
>         8 1 2 12 30 47 45
>         9 1 2 12 30 47
>         10 1 2 12 30
>         11 1 2 12 30 52
>         12 1 2 12 28 38
>         13 1 2 12 28 38 62
>         14 1 2 12 28 38 62 68
>         15 1 2 12 30 54 75
>         16 1 2 12 30 54
>         17 1 2 12 30 54 78
>         18 1 2 12 30 54 78 84
>         19 1 2 12 30 54 78 84 92
>         20 1 2 12 28 38 62 70
>         21 1 2 12 28 38 62 70 108
>         22 1 2 12 30 54 80
>         23 1 2 12 30 54 78 86
>         24 1 2 12 30 54 78 86 120
>         25 1 2 12 30 54 78 84 94
>         26 1 2 12 30 54 78 84 94 124
>         27 1 2 12 30 54 78 84 92 102
>         28 1 2 12 30 54 78 84 92 102 128
>         29 1 2 12 28 38 62 70 110
>         30 1 2 12 28 38 62 70 110 130
>         31 1 2 12 28 38 62 70 108 116
>         0 2 
>         1 2 2 5
>         2 2 2
>         3 2 2 5 6
>         4 2 2 5 6 18
>         5 2 2 5 6 18 22
>         6 2 2 14
>         7 2 2 16
>         8 2 2 5 6 20
>         9 2 2 5 6 20 44
>         10 2 2 5 6 18 26
>         11 2 2 5 6 18 22 32
>         12 2 2 5 6 18 22 32 58
>         13 2 2 14 40
>         14 2 2 16 42
>         15 2 2 5 6 20 44 50 75
>         16 2 2 5 6 20 44 50
>         17 2 2 5 6 18 26 56
>         18 2 2 5 6 18 22 32 60
>         19 2 2 14 40 72 109 101
>         20 2 2 14 40 72 109
>         21 2 2 14 40 72
>         22 2 2 5 6 20 44 50 80
>         23 2 2 5 6 20 44 50 80 118
>         24 2 2 5 6 20 44 50 80 118 120
>         25 2 2 5 6 20 44 50 80 118 120 122
>         26 2 2 14 40 72 109 101 102 127
>         27 2 2 14 40 72 109 101 102
>         28 2 2 14 40 72 109 101 104
>         29 2 2 14 40 72 116 133 131
>         30 2 2 14 40 72 116 133
>         31 2 2 14 40 72 116
>         0 3 
>         1 3 0
>         2 3 0 4
>         3 3 0 6
>         4 3 0 6 18
>         5 3 0 6 18 22
>         6 3 0 4 16 37
>         7 3 0 4 16
>         8 3 0 6 20
>         9 3 0 6 18 26 47
>         10 3 0 6 18 26
>         11 3 0 6 18 22 32
>         12 3 0 6 18 22 32 58
>         13 3 0 4 16 42 69
>         14 3 0 4 16 42
>         15 3 0 6 18 26 47 48
>         16 3 0 6 18 26 47 48 74
>         17 3 0 6 18 26 56
>         18 3 0 6 18 22 32 60
>         19 3 0 6 18 22 32 58 64
>         20 3 0 6 18 22 32 58 66
>         21 3 0 6 18 22 32 58 66 108
>         22 3 0 6 18 26 47 48 76
>         23 3 0 6 18 26 56 86
>         24 3 0 6 18 26 56 88
>         25 3 0 6 18 26 56 90
>         26 3 0 6 18 22 32 60 96
>         27 3 0 6 18 22 32 60 98
>         28 3 0 6 18 22 32 58 64 104
>         29 3 0 6 18 22 32 58 64 106
>         30 3 0 6 18 22 32 58 66 112
>         31 3 0 6 18 22 32 58 66 114
>         0 4 
>         1 4 0
>         2 4 2
>         3 4 0 6
>         4 4 0 8
>         5 4 0 10
>         6 4 2 16 37
>         7 4 2 16
>         8 4 0 8 24 45
>         9 4 0 8 24
>         10 4 0 8 26
>         11 4 0 8 26 52
>         12 4 2 16 37 38
>         13 4 2 16 42 69
>         14 4 2 16 42
>         15 4 0 8 24 48
>         16 4 0 8 24 50
>         17 4 0 8 26 56
>         18 4 0 8 26 52 60
>         19 4 2 16 37 38 64
>         20 4 2 16 42 69 70
>         21 4 2 16 42 69 72
>         22 4 0 8 24 48 76
>         23 4 0 8 24 50 82
>         24 4 0 8 26 56 88
>         25 4 0 8 26 52 60 94
>         26 4 0 8 26 52 60 96
>         27 4 0 8 26 52 60 98
>         28 4 2 16 37 38 64 104
>         29 4 2 16 42 69 70 110
>         30 4 2 16 42 69 70 112
>         31 4 2 16 42 69 70 114

【问题讨论】:

  • 文件中是否有前导>?是第一列吗?或者那是一个 SO 格式的残余,并且列以第一个数字开头?
  • I don’t expect this value 为什么会这样,你有什么期望?
  • @Etan Reisner; > 不是列。
  • 您是否期望超过这个数字?您的某些行的字段数超过 7,因此您的 awk 停止工作。
  • @anubhava。我预计 67

标签: linux shell awk scripting


【解决方案1】:

您可以尝试使用此awk 命令来计算忽略第一列和第二列的唯一值:

awk '{$1=$2=""; !seen[$0]++} END{print length(seen)}' file
130

如果您计算不包括第 1 列和第 2 列的唯一数并忽略奇数,请使用:

awk '{for (i=3; i<=NF; i++) !($i%2) && !seen[$i]++} END{print length(seen)}' file
63

【讨论】:

  • 非常感谢 anubhava,我想 76 是正确的答案。将为不同的输出尝试这个并让你知道:)
  • 再次感谢您的回答 anubhava,我已经得出结论,通过忽略计算中的奇数将获得所需的结果。如果您修改答案以最终确定,将不胜感激。
猜你喜欢
  • 2021-05-21
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2012-06-23
  • 2011-04-16
相关资源
最近更新 更多