我想使用 sed 或 awk 命令仅打印列表中在模式 1 方面唯一且模式 2 具有最高值的行。输入是文件名列表,这些文件名是特定模型的软件版本。型号和软件版本都包含在文件名中。花样是这样的:
a,b_x.y.z_
或者 a,b_x.y_
模式 1 是a,b
(型号) 模式 2 是x.y.z
(软件版本)
对于a,b
我想找到的每个独特版本的最新版本x.y.z
或x.y
注意我不想按创建或修改的时间等进行搜索……这必须通过软件版本和型号的字符串来完成
我想使用 sed 或 awk 命令仅打印列表中在模式 1 方面唯一且模式 2 具有最高值的行。输入是文件名列表,这些文件名是特定模型的软件版本。型号和软件版本都包含在文件名中。花样是这样的:
a,b_x.y.z_
或者 a,b_x.y_
模式 1 是a,b
(型号) 模式 2 是x.y.z
(软件版本)
对于a,b
我想找到的每个独特版本的最新版本x.y.z
或x.y
注意我不想按创建或修改的时间等进行搜索……这必须通过软件版本和型号的字符串来完成
就像@shellter 说的那样sed
真的不适合这个。我会使用awk
或类似的东西。对于版本号,每个子号都需要进行数字比较。你可以尝试这样的事情:
awk '
BEGIN{
FS=OFS="_"
}
{
# Use "." to split current and version numbers into field arrays
m=split($2,New,/\./)
n=split(Version[$1],Current,/\./)
# loop from 1 through the highest number of fields (whichever of the two versions contains the most fields)
for(i=1; i<=(m>n?m:n); i++) {
# they are unequal no need to compare further fields, if the new one is higher then replace.
if(New[i]!=Current[i]){
if(New[i]>Current[i]) Version[$1]=$2
next
}
}
}
END{
for(i in Version)print i,Version[i]
}
' file
我做了一些修改以打印最后一部分并忽略比较中的目录树。看看这是否有效:
awk -F_ '
{
# save current record
p=$0
# remove directory info
sub(/.*\//,x)
# Use "." to split current and version numbers into array
m=split($2,New,/\./)
n=split(Version[$1],Current,/\./)
# loop from 1 through the highest number of fields (whichever of the two versions contains the most fields)
for(i=1; i<=(m>n?m:n); i++) {
# they are unequal no need to compare further fields, if the new one is higher then replace.
if(New[i]!=Current[i]) {
if(New[i]>Current[i]) {
Version[$1]=$2
Line[$1]=p
}
next
}
}
}
END{
for(i in Version)print Line[i]
}
' file