我有一个结构如下的文本文件:
P,ABC,DEF
P,GHI,JKL
B,ABC,DEF
B,MNO,PQR
我想计算在保留字段 1 的同时字段 2 和 3 相同的行出现的次数。因此,输出将如下所示:
2,P,ABC,DEF
1,P,GHI,JKL
2,B,ABC,DEF
1,B,MNO,PQR
uniq -c
行不通(据我所知),因为它不能按字段分开。sort -u -t, -k2,2 -k3,3
也不会起作用,因为它不能计数(据我所知),并且所写的命令只会将第三行作为副本销毁,同时留下第一行。
归根结底,我需要返回的是第 2 行和第 4 行,因为字段 2 和 3 的组合是唯一的。但是,我需要保留字段 1,因为它指的是(在现实世界中)字段 2 和 3 来自哪个数据集。所以,返回第 2 行和第 4 行的解决方案确实是我需要的。
因此,以下解决方案也有效:
P,GHI,JKL
B,MNO,PQR
接受您的
sort
命令,我可以委托-u
给uniq -u
,这允许我使用 的-f
选项uniq
。此选项忽略给定数量的前导字段。您想忽略第一个字段,因此-f1
. 为此,我需要将每个,
转换为空白并返回:虽然这适用于您的示例数据集,但当有空白时它会失败。这是因为
uniq -f
将字段识别为[[:blank:]]*[^[:blank:]]*
. 如果您的实际数据中有空白,那么它们会uniq
识别出比您想要的更多的字段。为了克服这个问题,您需要将实际空白翻译为非空白,执行
uniq
,然后翻译回来。在 POSIX 语言环境[:blank:]
中,仅包含空格和制表符;在其他地区,它可能包括更多。以下命令将空格临时转换为 DC1 字符(设备控制 1,八进制
021
)和制表符转换为 DC2(设备控制 2,八进制022
):如果只有数据不包含 DC1 或 DC2,它应该可以工作。
即使您
tr
不支持多字节字符,翻译也不会干扰 UTF-8 的多字节字符,因为 UTF-8 中多字节字符的每个字节中的最高有效位始终是1
,而对于 DC1 或DC2 是0
。