[英]How do I use awk/sed to merge a field across multiple rows based on matching column values?
[英]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.