Sed/Tr 对 api 输出进行排序

Posted

技术标签:

【中文标题】Sed/Tr 对 api 输出进行排序【英文标题】:Sed/Tr to sort api output 【发布时间】:2021-07-14 02:23:49 【问题描述】:

我需要帮助来对 api 输出进行排序并排序并获取最新的


 "name" : "xyz.abc",
 "tags" : [ "1.0.33", "1.0.35", "1.0.47", "1.0.63", "1.0.56", "1.0.45", "1.0.58", "1.0.31", "1.0.39", 
 "1.0.30", "1.0.51", "1.0.41", "1.0.46", "1.0.32", "1.0.64", "1.0.65", "1.0.67", "1.0.42", "1.0.36", 
 "1.0.37", "1.0.53", "1.0.43", "1.0.44", "1.0.48", "1.0.49" ]

我试过了-

     cat test2.text | grep tags | tr -d '[|]' | sed -n '/ *"tags" *: *"/  s///; s/".*//; p; '`
     1.0.33

需要输出:

      1.0.67

【问题讨论】:

如果您要解析 JSON,请使用专门用于此目的的工具:jq 并非所有标签值都与"tags"在同一行 |tr -d '[|]' 中的作用是什么?该字符没有出现在 API 输出中,为什么需要删除它? 我认为他的目标是删除除数字以外的所有字符以尝试对其进行排序。 【参考方案1】:

试试这个:

cat test2.text | jq .tags | tr -d '"|,|[|]' | awk 'print $1' | sort | tail -1

输出:

1.0.67

【讨论】:

【参考方案2】:

您可以将ruby 与内置 JSON 库一起使用,如下所示:

$ ruby -r json -e 'puts JSON.parse($<.read)["tags"]' file | sort | tail -n 1
1.0.67

或者,完全在 ruby 没有管道:

$ ruby -r json -e 'puts JSON.parse($<.read)["tags"].sort_by|s| s.split[-1][-1]' file 

或者,使用jqsed

$ jq -c '.tags | sort' file | sed -nE 's/.*"([0-9.]*)"]$/\1/p'
1.0.67

或者直接使用jqmax

$ jq -c '.tags | max' file 
"1.0.67"                     # you can remove the " with sed

这些适用于您的示例,但会因其他常用版本字符串而失败。例如,1.0.255 是比1.0.67 更高还是更低的版本?

如果您想进行正确的版本排序(例如,1.0.255 的排序晚于 1.0.67),您可以在 Ruby 中使用:

$ ruby -r json -e 'puts JSON.parse($<.read)["tags"].sort_by|s| Gem::Version.new(s)[-1]' file 

许多版本的 Unix sort 也支持版本排序,所以如果你想支持带有 -V 参数的典型版本字符串来对上面的管道进行排序。

【讨论】:

【参考方案3】:

使用了解 JSON (jq) 和版本(GNU 排序)的工具。

jq -r .tags[] test2.text | sort -V | tail -1

【讨论】:

以上是关于Sed/Tr 对 api 输出进行排序的主要内容,如果未能解决你的问题,请参考以下文章

排序后的Flink join运算符似乎是组字段(Scala)

如何对最终输出的数据进行排序?

使用 php 对 MySql 的输出进行排序

按字母顺序对HashMap程序的输出进行排序[重复]

批处理:如何按扩展对输出进行排序

按添加的 WHERE 条件的顺序对 SQL 输出进行排序