我有一个包含两个字段的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行的文件。
谢谢!
答案 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))