使用Shell命令统计文件中无序成对文本的出现次数
解决互为逆序成对文本的统计问题
嘿,这个需求太常见啦!要把A,B和B,A这类互为逆序的成对文本当成同一种情况统计,核心思路就是先把每一对的顺序标准化,让逆序的条目变成完全相同的字符串,之后再统计就简单多了。
直接得到结果3的命令
如果你的目标就是拿到最终的不同对数量(也就是3),直接用这条命令就行:
awk -F',' '{print ($1 < $2) ? $1","$2 : $2","$1}' input.txt | sort | uniq | wc -l
分步拆解每一步
咱们把命令拆开来,看看每部分都在做什么:
awk -F',' '{print ($1 < $2) ? $1","$2 : $2","$1}':
用逗号分隔每一行的两个元素,再用三元运算符做判断——如果第一个元素的字典序小于第二个,就原样输出;否则交换两者顺序后输出。这样B,A会变成A,B,D,A会变成A,D,所有逆序对都被统一成了相同的格式。sort:
因为uniq只能识别连续重复的行,所以先排序让相同的标准化条目聚在一起,确保后续统计准确。uniq:
去掉重复的条目,只保留每个唯一的标准化对。wc -l:
统计剩下的行数,也就是不同对的数量,这里正好是你要的3。
查看每对的具体出现次数
如果还想知道每对到底出现了几次,可以把wc -l换成uniq -c,命令变成:
awk -F',' '{print ($1 < $2) ? $1","$2 : $2","$1}' input.txt | sort | uniq -c
执行后会输出:
2 A,B 2 A,C 2 A,D
能清楚看到每对都出现了2次,总共有3个不同的对,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Huzaifa
相关产品推荐
相关产品推荐

