【问题标题】:Finding Rows with Equal Values, Comparing their Columns and Removing the Smaller Value's Line查找具有相等值的行,比较它们的列并删除较小值的行
【发布时间】:2019-02-22 21:37:22
【问题描述】:

我有以下代码行:

grep -nP ';MULTIALLELIC' biallelic.output | sort -k2 | awk -F'[:;\t]' '{print $1,$3,$9,$13}'

它输出:

2374 213 MID=212 GO=1
2462 213 MID=477 GO=137
2394 233 MID=232 GO=1
2464 233 MID=668 GO=1070
2185 24 MID=23 GO=1
2465 24 MID=752 GO=1083
2146 48 MID=354 GO=1010
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1
2463 58 MID=595 GO=1057

我需要根据第二列中的值比较 GO 值。无论哪一行的 GO 值较大,我都想从原始文件中删除该行号。


通过添加awk '{print>$2}',我可以根据第二列中的值分隔行,但我试图避免将结果写入文件。

我错过了什么?

编辑:我实际上是在尝试从 biallelic.output 中删除这些行,而不仅仅是打印我想要删除的行。很抱歉造成混乱。

【问题讨论】:

  • 您是在比较 GO 值还是与 $2 比较?
  • 2 美元。我想将所有行与 $2 中的相等值进行比较。因此,在我的示例中,我将比较第 1 行和第 2 行,因为它们的 $2 值均为 213。然后比较这些行的 GO 值并从 biallelic.output 中删除第二行,因为 1037 > 1。
  • 为了一目了然,将第二行的 GO 值更改为 137。
  • 但是,您并没有真正删除任何记录,而只是报告需要完成的工作。我猜你想要一个删除了这些记录的文件,不是吗?
  • 我实际上想删除这些行,这是我的错,造成混乱。问题已被编辑。

标签: awk sed editing


【解决方案1】:

这将相互比较GO值并列出与最小值相比值更高的记录。

$ sed 's/GO=/& /' file | 
  sort -k2,2 -k5n      | 
  awk 'a[$2]++{if(!h) print h="Lines Removed From biallelic.output";
               print $1}'

Lines Removed From biallelic.output
2462
2464
2465
2146
2463

如果没有报告值,将有条件地打印标题。

拆分最后一个字段以将数字与前缀分开以进行排序,按第二个字段分组值并按数字排序GO值。每个组的第一个是最小值,报告除每个组的第一个之外的所有。

得到过滤后的输出

$ sed 's/GO=/& /' file | 
  sort -k2,2 -k5n      | 
  awk '!a[$2]++ {sub(/GO= /,"GO="); print}'

2374 213 MID=212 GO=1
2394 233 MID=232 GO=1
2185 24 MID=23 GO=1
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1

【讨论】:

  • 这很好用,谢谢。是否可以将 $1 中的行号通过管道传输到 sed 以将它们从原始文件中删除?像sed '{}d' 这样的东西如果有意义的话。
  • 不确定我是否理解。第二个脚本为您提供了过滤掉不需要的记录的输出。是否要删除第一个字段 ($1)?如果是这样,请使用print $2,$3,$4,而不是print
  • 第一个字段是来自 biallelic.output 的行号。如果您从代码中删除! 并再次运行它,然后打印 $1,那么结果将是我希望从原始 biallelic.output 中删除的行。我没有发布 biallelic.output 的全部内容,因为大部分内容都没有被修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2018-05-24
  • 2015-02-26
相关资源
最近更新 更多