Bash 删除重复的包依赖项,按版本排序

Bash 删除重复的包依赖项,按版本排序,bash,awk,Bash,Awk,我有这样一个文件,例如: "grunt": "0.4.5", "grunt": "1.0.1" "grunt": "1.0.1", "grunt-angular-templates": "0.5.7", "grunt-cli": "^0.1.13", "grunt-contrib-clean": "0.6.0", "grunt-contrib-compress": "0.12.0", "grunt-contrib-concat": "1.0.1", 现在,我想删除具有重复前缀的行,但保留具有较

我有这样一个文件,例如:

"grunt": "0.4.5",
"grunt": "1.0.1"
"grunt": "1.0.1",
"grunt-angular-templates": "0.5.7",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-compress": "0.12.0",
"grunt-contrib-concat": "1.0.1",
现在,我想删除具有重复前缀的行,但保留具有较新版本的行。因此,对于以grunt开头的行,我希望保留版本为1.0.1的行,但删除其他的行


有一个简单的方法可以做到这一点吗?

一个简单方法的实现非常简单:

sort -k1,1 -k2,2Vr file | sort -k1,1 -u
i、 e:使用()按第一个字段(包名称)升序排序,按第二个字段(版本)降序排序。然后在第二次传递中(第二次
排序
调用,使用
-u
/
--unique
标志),只需按包名进行比较,并删除所有重复的包(名称相同但版本号较小的包,因为在第一次传递后,顶部将显示更大的版本)

示例输入的结果是:

"grunt": "1.0.1",
"grunt-angular-templates": "0.5.7",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-compress": "0.12.0",
"grunt-contrib-concat": "1.0.1",
然而,由于
npm
(我假设这些是
package.json
中的行)使用,正确处理semver排序比上述
排序
方法要复杂得多

例如,您必须对版本进行排序,如
=version
~version
^version
version1-version2
,甚至
range1 | range2
,甚至URL文件/路径GitHub URL标记,等等


要处理所有这些(有效的)版本,最好使用专门的工具,例如。

一个简单方法的实现将非常简单:

sort -k1,1 -k2,2Vr file | sort -k1,1 -u
i、 e:使用()按第一个字段(包名称)升序排序,按第二个字段(版本)降序排序。然后在第二次传递中(第二次
排序
调用,使用
-u
/
--unique
标志),只需按包名进行比较,并删除所有重复的包(名称相同但版本号较小的包,因为在第一次传递后,顶部将显示更大的版本)

示例输入的结果是:

"grunt": "1.0.1",
"grunt-angular-templates": "0.5.7",
"grunt-cli": "^0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-compress": "0.12.0",
"grunt-contrib-concat": "1.0.1",
然而,由于
npm
(我假设这些是
package.json
中的行)使用,正确处理semver排序比上述
排序
方法要复杂得多

例如,您必须对版本进行排序,如
=version
~version
^version
version1-version2
,甚至
range1 | range2
,甚至URL文件/路径GitHub URL标记,等等


要处理所有这些(有效)版本,最好使用专门的工具,例如。

我认为删除重复项是一项简单的任务,但确定“最新版本”可能很困难。这意味着您必须解释和阅读版本,并确定哪个版本是最新的。以下是一些参考资料:《代码》“^0.1.13”是什么意思?它应该如何排序?您没有指定前缀的确切组成部分。根据我得到的信息,我建议
sed's/*/'| sort-u | head-1
。我只是在开玩笑。:)@yacc您忘记了
-i
。对于前缀,字符串应该逐字母匹配。在这种情况下,“咕噜”将是完全匹配的。我认为删除重复项是一项简单的任务,但确定“更新的版本”可能会很困难。这意味着您必须解释和阅读版本,并确定哪个版本是最新的。以下是一些参考资料:《代码》“^0.1.13”是什么意思?它应该如何排序?您没有指定前缀的确切组成部分。根据我得到的信息,我建议
sed's/*/'| sort-u | head-1
。我只是在开玩笑。:)@yacc您忘记了
-i
。对于前缀,字符串应该逐字母匹配。在这种情况下,“咕噜”将是完全匹配的。