【问题标题】:Remove duplicated rows based on column values using awk or sed使用 awk 或 sed 根据列值删除重复的行
【发布时间】:2015-05-25 09:46:50
【问题描述】:

这是数据文件df

Gene    CHR Start   End Window
AKT3    chr1    243651534   244006553   355019
AKT3    chr1    243666483   244006553   340070
CBL chr11   119076989   119178858   101869
CLCF1   chr11   67131640    67141206    9566
CLCF1   chr11   67131640    67141648    10008

我想删除 Gene 列中重复的行,只保留最大 window 的行。

结果应该如下所示:

Gene    CHR Start   End Window
AKT3    chr1    243651534   244006553   355019
CBL chr11   119076989   119178858   101869
CLCF1   chr11   67131640    67141648    10008

我可以使用以下代码在 R 中做到这一点:

data = split(df, df$Gene)
data = lapply(data, function(x) x[which.max(x$Window), , drop=FALSE])
data = do.call("rbind", data)

但是谁能告诉我如何使用 awk 或 sed 来做到这一点?

谢谢。

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    使用awk 你可以做到:

    awk '!seen[$1] || $5 > max[$1]{seen[$1]=$0; max[$1]=$5}
         END { for (i in seen) print seen[i]}' file
    CLCF1   chr11   67131640    67141648    10008
    AKT3    chr1    243651534   244006553   355019
    CBL chr11   119076989   119178858   101869
    

    这个 awk 命令使用数组 seen 来只保留唯一的行。此命令还使用数组 max 来为每个 $1 保留第 5 列的最大值。 seen 首次填充或当前记录的 $5 大于 max 数组中的相应条目时填充。

    要获得格式化输出

    awk '!seen[$1] || $5 > max[$1]{seen[$1]=$0; max[$1]=$5}
       END { for (i in seen) print seen[i]}' file | column -t
    CLCF1  chr11  67131640   67141648   10008
    AKT3   chr1   243651534  244006553  355019
    CBL    chr11  119076989  119178858  101869
    

    【讨论】:

    • 我在回答中添加了一些解释。
    【解决方案2】:

    假设您的文件是制表符分隔的
    您可以使用以下代码
    sort -t$'\t' -k5nr File|awk -F'\t' '!a[$1]++'
    它是这样工作的
    根据窗口列按数字排序,然后只允许第一条记录

    【讨论】:

      猜你喜欢
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多