根据重复值删除行

时间:2014-11-08 03:45:11

标签: r bash

我有一个包含两个字段的bash文件。

例如:

ABC 0.23    
BCA 2.30    
AZS 1.23
CDA 2.11
XDS 0.45
ABC NA
CDA NA
ANG NA

第一栏ABC和CDA中有两个重复项。这两个副本在第二列中都有NA。我想删除那些有重复的行,但删除那个在第二行中保留NA的行,同时保留所有其他行。

期望的输出:

ABC 0.23
BCA 2.30
AZS 1.23
CDA 2.11    
XDS 0.45
ANG NA

我试过R但输出很乱。我希望在bash中有一个更好的方法来处理大约40000行的文件。

谢谢!

2 个答案:

答案 0 :(得分:2)

这是使用awk的一个解决方案:

awk '( !($1 in val) || $2 != "NA" ) { val[$1] = $2 } 
     END { for (k in val) { print k" "val[k] } }'

输出:

CDA 2.11
ABC 0.23
AZS 1.23
ANG NA
XDS 0.45
BCA 2.30

如果您需要保留行的顺序,则需要更多工作。

答案 1 :(得分:0)

您可以在R

中使用unique中的data.table
library(data.table)
unique(setDT(df)[order(is.na(Col2))], by='Col1')
#   Col1 Col2
#1:  ABC 0.23
#2:  BCA 2.30
#3:  AZS 1.23
#4:  CDA 2.11
#5:  XDS 0.45
#6:  ANG   NA

数据

df <- structure(list(Col1 = c("ABC", "BCA", "AZS", "CDA", "XDS", "ABC", 
"CDA", "ANG"), Col2 = c(0.23, 2.3, 1.23, 2.11, 0.45, NA, NA, 
NA)), .Names = c("Col1", "Col2"), class = "data.frame", row.names = c(NA, 
-8L))