大家好!
我想删除重复项,并在包含4个字段的文件中保留一列(第4列)中具有最高值的行。我必须在Linux服务器上执行此操作。
之前
gene subj e-value ident
g1 h1 0.05 75.5
g1 h2 0.03 60.6
g2 h7 0.00 80.5
g2 h9 0.00 50.3
g2 h4 0.03 90.7
g3 h5 0.10 30.5
g3 h8 0.00 76.8
g4 h11 0.00 80.7
后
gene subj e-value ident
g1 h1 0.05 75.5
g2 h4 0.03 90.7
g3 h8 0.00 76.8
g4 h11 0.00 80.7
非常感谢你,如果我再问一遍,我很抱歉!但我没有找到问题的答案。
答案 0 :(得分:2)
如果没有标题输出没问题,你可以试试这个:
tail -n +2 file.txt | sort -k1,1 -k4,4rn | sort -uk1,1
说明:
tail -n +2 file.txt
将删除标题,以便它们不会参与所有排序。
sort -k1,1 -k4,4rn
将按列1排序(-k1,1
),然后按列4按数字顺序排序(-k4,4rn
)
最后:
sort -uk1,1
将仅考虑第一列删除重复项。
请注意-k1,1
表示从第一列到第一列,因此-k4,4
从第4列到第4列。调整以适合您的列。
答案 1 :(得分:0)
使用GNU datamash 工具:
datamash --headers -Wfs -g1 max 4 < file | cut -f1-4
输出:
gene subj e-value ident
g1 h1 0.05 75.5
g2 h4 0.03 90.7
g3 h8 0.00 76.8
g4 h11 0.00 80.7
答案 2 :(得分:0)
awk解决方案,但为了简单起见,我喜欢archimiro版本。
public static void AnimateBackgroundColor(Control control, Color fromColor,Color toColor,int duration)
{
Rectangle rect = new Rectangle();
rect.setFill(fromColor);
FillTransition tr = new FillTransition();
tr.setShape(rect);
tr.setDuration(Duration.millis(duration));
tr.setFromValue(fromColor);
tr.setToValue(toColor);
tr.setInterpolator(new Interpolator() {
@Override
protected double curve(double t) {
control.setBackground(new Background(new BackgroundFill(rect.getFill(), CornerRadii.EMPTY, Insets.EMPTY)));
return t;
}
});
tr.play();
}
结果:
awk '
NR>1 && $1 in arr {
if ($4 > arr[$1][4])
split($0, arr[$1])
next
}
NR>1 {
arr[$1][1] = ""
split($0, arr[$1])
}
END {
for(i in arr) {
for(j in arr[i])
printf arr[i][j] "\t"
print ""
}
}
' data.file