【问题标题】:Selecting unique lines based on two columns基于两列选择唯一行
【发布时间】:2017-04-24 03:53:32
【问题描述】:

我一直在尝试找出一种方法来根据两列的值选择唯一的行。例如,这是我的文件的示例/示例:

chr1    10    12
chr1    10    12
chr1    10    11
chr1    9    12
chr2    15    20

这就是我希望输出的样子:

chr1    10    12
chr1    10    11
chr1    9    12
chr2    15    20

我尝试使用此代码,因为我喜欢它不会弄乱我的文件顺序:

awk -F"\t" '!_[$2]++' SNP_positions.txt > SNP_positions_uniq.txt

但是,它仅捕获一列的独特特征。有没有办法编辑它以使其适用于两列?

【问题讨论】:

  • 您提到了两列,但您的文件中有三列。应该考虑哪些?如果可能,请举一个更通用的例子。您当前的方法适用于给定文件,因此可能还有其他内容。
  • 我想在第二列和第三列中找到具有唯一值的行。如果我使用输出上方的代码,我的输出中不会出现第三行(chr1 122332 130204)。我将进行编辑以使其更简单
  • 谁告诉你用_作为变量名是白痴,不要再听他们的了。我们都知道通常最好避免使用单字母变量名,因为它们对提高代码的清晰度没有任何帮助,但是使用甚至不是字母的东西就是荒谬的。
  • @cosmictypist 如何在 mysql 中运行此查询。我有同样的问题

标签: unix awk


【解决方案1】:

您可以完美地为数组元素使用使用多个字段的索引:

awk -F"\t" '!seen[$2, $3]++' file

在这种情况下,我们使用$2, $3 作为索引。这样,我们将得到元组($2, $3)的所有不同元素。

【讨论】:

  • 如果我想对所有三列都使用它,代码应该如下所示:awk -F"\t" '!uniq[$1 FS $3]++' fileawk -F"\t" '!uniq[$1 FS $2 FS $3]++' file'
  • @christylynn002 如果你想使用完整的行,说uniq[$0] 会更快。如果您想要三个以上,uniq[$1 FS $2 FS $3]。请注意,我们使用FS 来防止2\tab3 匹配2 3 的行。
  • 啊,完美。谢谢!我想我终于明白了。
  • @jaypalsingh 请注意,数组索引中的, 与打印语句中的, 不同。前者获取SUBSEP 的值(默认为控制字符),而后者获取OFS 的值(默认为空格)。
【解决方案2】:

提供的awk 解决方案很棒而且速度很快,但我自己来这里是为了寻找sort 解决方案,它几乎在所有情况下都可能更慢:

cat file | sort -u -k1,1 -k2,2 -k3,3 -s

我在这里找到了答案: https://stackoverflow.com/a/12546627/778533

【讨论】:

  • 你可以写LC_ALL=C sort -S70% -u -k1,1 -k2,2 -k3,3 -s来加快速度
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
相关资源
最近更新 更多