这是数据文件 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做到这一点?
感谢。
答案 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]++'
这是它的工作方式
根据窗口列以数字方式排序,然后仅允许第一条记录