我有一个带有标识符和值的文件:
ABC123 111111
ABC123 111111
ABCDEF 333333
ABCDEF 111111
CCCCCC 333333
ABC123 222222
DEF123 444444
DEF123 444444
两列都包含重复值,但我需要计算具有相同 ID(第一列)和唯一值(第二列)的行数。这将产生上述输入的输出:
ABCDEF 2
ABC123 2
DEF123 1
CCCCCC 1
...其中第一列是 ID,第二列是第二列中唯一值的数量。换句话说,我需要找出给定 ID 有多少个唯一值。
我最接近的是这个,但它所做的只是计算第一列的唯一值:
cut -d " " -f1 "file.txt" | uniq -cd | sort -nr | head
我该如何在 Bash 中做这样的事情?
这
awk
应该对你有用:这够接近了吗?
您可以进一步用它进行过滤以
| grep -vw '1'
模仿HAVING COUNT(DISTINCT value) > 1
语义并从此示例的输出中删除最后两行(假设这不是1
标识符的合法值!)。当然,您也可以通过多种方式反转列顺序。例如
使用任何 awk:
或者如果字段之间的空白可以变化,那么仍然可以使用任何 awk:
或使用 GNU awk (用于多维数组):
假设:
另一种
awk
方法:这将生成:
如果需要对输出进行排序,则将结果通过管道传输到适当的
sort
命令,例如:这是一个 Ruby 实现的:
印刷:
不清楚是否
CCCCCC 1
应该在输出中。如果是,则无需过滤:印刷:
您还可以执行这个 POSIX 管道:
或者
awk
仅使用 来消除使用 uniqifing 的需要sort -u
:以下任一张印刷品(可能顺序不同):
我将利用 GNU
AWK
完成以下任务,让file.txt
内容然后
给出输出
解释:我使用 2D 数组
arr
,但不存储任何值(仅存储键),然后我遍历上层,并使用length
函数为每个层检测子键的数量。如果您需要将输出设置PROCINFO["sorted_in"]
为预定义数组扫描顺序BEGIN
之一,例如将给出输出
即按字典顺序升序排列
(在 GNU Awk 5.1.0 中测试)
使用
bash
关联数组(在我看来)是 mark markp-fuso 方法的穷人版awk
。• 当数据/文件规模较大时,速度会非常非常慢。
• 请参阅关联数组算术上下文问题