【问题标题】:How to count the unique values in 2 fields without concatenating them?如何在不连接它们的情况下计算 2 个字段中的唯一值?
【发布时间】:2015-06-22 17:06:37
【问题描述】:

我正在尝试使用 unix 中的基本 shell 来计算 2 个字段中的唯一值。我有 5 列的数据,但只是计算前 2 列中的唯一值而不连接它们。 到目前为止,我成功使用 cut -f 1 |排序 |独特 | wc -l 计算第一列中的唯一值,我可以对第二列执行相同的操作,但是由于第一列和第二列中的某些值相同,我需要能够执行此命令,将第一列和第二列视为一个场地。谁能帮帮我?

【问题讨论】:

  • 我不完全明白:第1列和第2列的组合必须是唯一的吗?
  • 提供一个数据示例可能会有所帮助。
  • 是否“cut -f 1,2 | sort | uniq | wc -l”没有给出你想要的结果

标签: linux field uniq


【解决方案1】:

你的问题可以用两种方式解释,所以我两种都回答。

给定输入文件:

2       1
2       1
1       2
1       1
2       2

如果您希望结果输出 4,因为唯一对是 1 11 22 12 2,那么您需要:

cat test|cut -f1,2|sort|uniq|wc -l

我们在这里做什么:我们只选择前两列以及分隔符并将其传递给完成这项工作的sort|uniq

另一方面,如果您希望结果输出 2,因为只有两个唯一元素:12,那么您可以像这样调整上面的内容:

cat test|cut -f1,2|tr "\t" "\n"|sort|uniq|wc -l

这次在我们选择了前两列之后,我们将每一列分成两行,以便sort|uniq 提取它们。

只要列用 TAB 字符而不是空格分隔,这些就可以工作。由于您在问题中没有将-d 选项传递给cut,并且cut 默认使用制表符,因此我假设您的输入也使用制表符。

【讨论】:

  • 有没有办法调整它,因为有 3 种独特的值组合(2 2、1 1 和 1 2),所以您会得到 3 的输出?
猜你喜欢
  • 2023-04-11
  • 2023-01-15
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多