【问题标题】:Unix awk - count of occurrences for each unique valueUnix awk - 每个唯一值的出现次数
【发布时间】:2018-10-22 16:45:53
【问题描述】:

在 Unix 中,我打印字段中第一个字符的唯一值。我还打印了唯一字段长度的计数。 现在我想同时做这两件事。在 SQL 中很容易做到,但我不确定如何在 Unix 中使用 awk(或 grep、sed、...)来做到这一点。

打印第一个 UNIQ 前导字符

awk -F'|' '{print substr($61,1,1)}' file_name.sqf | sort | uniq

打印长度为 8、10、15 的字段计数

awk -F'|' 'NR>1 {count[length($61)]++}  END {print count[8] ", " count[10] ", " count[15]}' file_name.sqf | sort | uniq

期望的输出

first char, length 8, length 10, length 15
a, 10, , 150
b, 50, 43, 31
A, 20, , 44
B, 60, 83, 22

以大写或小写“a”开头的字段长度永远不会是 10。

输入文件是一个 |没有标题的分隔 .sqf。该字段是 varChar 15。

样本输入

56789 | someValue | aValue | otherValue | 712345
46789 | someValue | bValue | otherValue | 812345
36789 | someValue | AValue | otherValue | 912345
26789 | someValue | BValue | otherValue | 012345
56722 | someValue | aValue | otherValue | 712345
46722 | someValue | bValue | otherValue | 812345

想要的输出

a: , , 2
b: 1, , 1
A: , , 1
B: , 1,

'a' 有两个长度为 15 的实例 'b' 有一个长度为 8 和 15 的实例 'A' 有一个长度为 15 的实例 'B' 有一个长度为 10 的实例

谢谢。

【问题讨论】:

  • 请为您的问题添加示例输入 (file_name.sqf) 以获得所需的输出。
  • 您从发布的示例输入中从哪里获得“a ..length 15 'b' ..length 8”?给定列中的每个字段都具有相同的长度?

标签: unix awk count uniq


【解决方案1】:

我认为您需要一个更好的示例输入文件,但我想这就是您正在寻找的

$ awk -F' \\| ' -v OFS=, '{k=substr($3,1,1); ks[k]; c[k,length($3)]++}
                      END {for(k in ks) print k": "c[k,6],c[k,10],c[k,15]}' file

A: 1,,
B: 1,,
a: 2,,
b: 2,,

请注意,由于所有长度都是 6,因此我打印了该计数而不是 8。使用正确的数据,您应该能够获得您期望的输出。但请注意,订单不会保留。

【讨论】:

  • 太酷了! .............我对您的代码进行了细微调整,这很有效........ $ awk -F'|' -v OFS=, '{$3!=""} {k=substr($3,1,1); ks[k]; c[length($3)]++} END {for(k in ks) print k": "c[0],c[10],c[15]}'
  • 实际上............现在我仔细观察............几乎......问题是我的代码版本没有对每个前导字符 a、b、A、B 进行计数。而是将所有字符相加并给出相同的计数四次,但至少将列计数分开。
  • 建议:发布一个真实的输入文件,用发布的文件测试我的脚本。没有人知道你在测试什么,但根据我的输出,它按第一个字符计算长度。没有人知道你在测试什么。
  • 完成 - 您的代码实际上非常接近 awk -F'|' -v OFS=, '{$3!=""} {k=substr($3,1,1); ks[k]; c[k,length($3)]++} END {for(k in ks) print k": "c[k,0],c[k,10],c[k,15]}' FILE_NAME.sqf
  • 对于任何给定的字符,零长度如何出现?
猜你喜欢
  • 2011-05-12
  • 2020-10-07
  • 2012-10-25
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多