簡體   English   中英

使用awk或sed刪除基於列值的重復行

[英]Remove duplicated rows based on column values using awk or 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    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來做到這一點嗎?

謝謝。

使用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列的最大值。 當第一次或當前記錄的$5大於max數組中的對應條目時,將seen填充。

要獲取格式化輸出

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

假設您的文件已制表
您可以使用以下代碼
sort -t$'\\t' -k5nr File|awk -F'\\t' '!a[$1]++'
這是這樣的
根據窗口列進行數字排序,然后僅允許第一條記錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM