使用awk在文本文件中拟合值

时间:2018-03-27 06:28:12

标签: awk

我有一个像这个例子的文件:

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

你知道怎么解决吗?

2 个答案:

答案 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

并根据您的需要对输出进行排序。