如何订购具有特定条件的文本文件?

时间:2019-07-04 12:43:10

标签: linux bash awk command text-files

由于我是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脚本的任何建议?

感谢大家

4 个答案:

答案 0 :(得分:2)

使用sortawk

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

更新

另一个使用sortuniqshuf进行演示的人:

$ 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