Unix awk - 每个唯一值的出现次数

Unix awk - count of occurrences for each unique value

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

打印第一个 UNIQ 前导字符

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

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

awk -F'|' 'NR>1 {count[length()]++}  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,没有 header。该字段是 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

的实例

谢谢。

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

$ awk -F' \| ' -v OFS=, '{k=substr(,1,1); ks[k]; c[k,length()]++}
                      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。使用正确的数据,您应该能够获得预期的输出。但请注意,订单不会保留。