我有一个像这个例子的文件:
NDUFAF7,0.216216,
ESRRA,0.0178571,
HS3ST1,0.027027,
HS3ST1,0,
HS3ST1,0.0833333,
ESRRA,0.214286,
NDUFAF7,0.0824742,
ESRRA,0.0810811,
NDUFAF7,0,
其中有2 comma separated
列。在第1列中,重复了一些行。我想根据2nd column
中的值仅保留每个重复行中的一行。事实上我想保留第二排中价值最大的一个。以上示例的输出将是(tab separated
):
NDUFAF7 0.216216
HS3ST1 0.0833333
ESRRA 0.214286
我在awk
中尝试了以下代码,但没有返回我想要的内容。
awk -F "," '{ if($2 >= $2) { print }}' file_name
你知道怎么解决吗?
答案 0 :(得分:1)
解决方案1: 关注awk
可能对您有所帮助。它不会以Input_file的相同顺序首先给出字段的顺序。
awk -F"," '{a[$1]=a[$1]>$(NF-1)?a[$1]:$(NF-1)} END{for(i in a){print i,a[i]}}' Input_file
或者也是上述解决方案的非单线形式。
awk -F"," '
{
a[$1]=a[$1]>$(NF-1)?a[$1]:$(NF-1)
}
END{
for(i in a){ print i,a[i] }
}
' Input_file
解决方案第二: 如果您需要与Input_file相同的第一个字段序列,那么以下内容可以帮助您。
awk -F"," '!b[$1]++{c[++i]=$1} {a[$1]=a[$1]>$(NF-1)?a[$1]:$(NF-1)} END{for(j=1;j<=i;j++){print c[j],a[c[j]]}}' Input_file
或者现在添加非单一衬里形式的溶液。
awk -F"," '
!b[$1]++{ c[++i]=$1 }
{
a[$1]=a[$1]>$(NF-1)?a[$1]:$(NF-1)
}
END{
for(j=1;j<=i;j++){
print c[j],a[c[j]]}
}
' Input_file
<强> 编辑: 强>
awk -F"," '!b[$1]++{c[++i]=$1} {a[$1]=a[$1]>$(NF-1)?a[$1]:$(NF-1)} END{for(j=1;j<=i;j++){print c[j],a[c[j]]}}' Input_file
NDUFAF7 0.216216
ESRRA 0.214286
HS3ST1 0.0833333
答案 1 :(得分:1)
您可以使用以下命令:
$ sort -t',' -k1,2 -nr file | awk 'BEGIN{FS=",";OFS="\t"}{if(save!=$1){print $1,$2}save=$1}'
NDUFAF7 0.216216
HS3ST1 0.0833333
ESRRA 0.214286
<强>说明:强>
sort
将按字母顺序对第一列的名称进行排序,然后按照数字的降序对第二列进行排序。 awk
命令将获取每个集群的第一行(具有最大值的行并调整输出)
您还可以使用datamash
:
$ datamash -t',' --sort --group 1 max 2 < file | tr ',' '\t'
ESRRA 0.214286
HS3ST1 0.0833333
NDUFAF7 0.216216
并根据您的需要对输出进行排序。