由于我是linux命令和/或bash脚本的初学者,因此无法解决文本文件的问题。
我有一个像这样的文本文件:
object1 10.603 0.757
object1 10.523 0.752
object1 10.523 0.752
object1 10.456 0.747
object1 10.456 0.747
object1 10.271 0.734
object2 11.473 0.194
object2 11.460 0.194
object2 11.445 0.191
object2 11.421 0.190
object3 9.272 0.12
object3 9.236 0.12
object3 8.814 0.119
object3 0.968 0.119
object3 10.959 0.119
并且我必须在该文件上执行特定的剪切和排序操作:对于包含单词“ object1”,“ object2”等的每个字符串,我只想根据以下内容打印具有最高值的字符串:第三栏;然后我想根据第三列的值对该操作的输出进行排序。
为清楚起见,输出应如下所示:
object1 10.603 0.757
object2 11.473 0.194
object3 9.272 0.12
关于使用linux命令和/或bash脚本的任何建议?
感谢大家
答案 0 :(得分:2)
使用sort
和awk
:
sort -k1,1 -k3rn -k2rn file.txt | awk '!seen[$1] {print} {seen[$1]++}'
sort
首先对第一个字段进行排序,然后对第三个字段进行排序,然后对第二个字段进行排序(如果没关系,可以省略后者)。然后awk
仅打印仅考虑第一个字段而发现的前唯一行。
答案 1 :(得分:1)
awk中的一个:
$ awk '{
if(m[$1]<$3) { # if previous max for 1st field val is bigger
m[$1]=$3 # replace max value
r[$1]=$0 # store record
}
}
END { # in the end
for(i in r) # iterate hashed records
print r[i] # and output
}' file
输出(如果排序没有特殊要求,请在sort
块的开头使用PROCINFO["sorted_in"]="@ind_str_asc"
或GNU awk与END{}
):
object1 10.603 0.757
object2 11.473 0.194
object3 9.272 0.12
更新:
另一个使用sort
和uniq
,shuf
进行演示的人:
$ sort -k1r -k3n <(shuf file) | uniq -w 7
object3 9.272 0.12
object2 11.473 0.194
object1 10.603 0.757
为了对第一个字段进行分组,我使用了({man uniq
):
-w, --check-chars=N compare no more than N characters in lines
答案 2 :(得分:1)
这是另一个完成任务的awk
脚本。
script.awk
$1 == currObj{ # for each reoccouring object
if ( ($3 + 0) > maxArr[$1] ) maxArr[$1] = $3 + 0; # identify the max and store in maxArr
next; # skip to read next line
}
{ # for each line having new object
currObj = $1; # store current object in 1st field into variable currObj
maxArr[$1] = $3; # reset the maxArr to current value
fld2Arr[$1] = $2; # store 2nd field into an array;
}
END { # post processing
for (i in maxArr) print i, fld2Arr[i], maxArr[i]; # print for each index the array values
}
运行:
awk -f script.awk input.txt
输出:
object1 10.603 0.757
object2 11.473 0.194
object3 9.272 0.12
答案 3 :(得分:0)
在对数据进行排序之前,请先使用awk对其进行过滤。
awk 'a[$1] < $3 {a[$1] = $3; b[$1]=$0} END {for (i in a) print b[i]}' input | sort -k3rn