使用awk或sed根据列值删除重复的行

时间:2015-05-25 09:46:51

标签: bash awk sed

这是数据文件 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 列中重复的行,并且只保留一个具有最大窗口的行。

结果应如下所示:

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做到这一点?

感谢。

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:0)

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