Awk 对于模式1唯一且对于模式2具有最高值的输出行

Awk 对于模式1唯一且对于模式2具有最高值的输出行,awk,Awk,我想使用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 注意:我不想按创建或修改的时间等进行搜索。这必须通过软件版本和型号的字符串来完成,就像@Shelleter所说的sed真的不适合这样。我会使用awk或类似的东西。对于版本号,需要对每个子编号进行

我想使用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


注意:我不想按创建或修改的时间等进行搜索。这必须通过软件版本和型号的字符串来完成,就像@Shelleter所说的
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'
开始{
FS=OFS=“\u1”
}
{ 
#使用“.”将当前和版本号拆分为字段数组
m=拆分($2,新,/\./)
n=拆分(版本[$1],当前,/\./)
#从1循环到最大数量的字段(两个版本中包含最多字段的一个)
对于(i=1;in?m:n);i++{
#它们是不相等的,不需要比较更多的字段,如果新字段更高,则替换。
如果(新[i]!=当前[i]){
如果(新[i]>当前[i])版本[$1]=$2
下一个
}
}
} 
结束{
对于(版本中的i)打印i,版本[i]
}
"档案"

我做了一些修改来打印最后一部分,并在比较中忽略目录树。看看这是否有效:

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
awk-F
{ 
#保存当前记录
p=$0
#删除目录信息
子(/.\/,x)
#使用“.”将当前和版本号拆分为数组
m=拆分($2,新,/\./)
n=拆分(版本[$1],当前,/\./)
#从1循环到最大数量的字段(两个版本中包含最多字段的一个)
对于(i=1;in?m:n);i++{
#它们是不相等的,不需要比较更多的字段,如果新字段更高,则替换。
如果(新[i]!=当前[i]){
if(新[i]>当前[i]){
版本[$1]=$2
行[$1]=p
}
下一个
}
}
} 
结束{
对于(版本中的i)打印行[i]
}
"档案"

虽然您可以按照sed中的要求进行操作,但这将超出任何普通sed用户所能理解的范围
awk
非常适合这样的任务。考虑编辑问题以允许AWK回答。好的lukc。谢谢,我正在编辑的原始脚本中已经有一些sed命令,所以我认为最好还是坚持使用它,但是如果awk是适合这项工作的工具,我很乐意使用它!这正接近@Scrutnizer!这个脚本用了一批56行,变成了28行,所有的遗漏都是正确的。还有一些额外的文件没有像我们希望的那样进行比较,但我认为这是我对问题的理解,而不是你的脚本:)有两件事很突出。第一个是,在x.y.z或x.y之后,文件名的末尾是Backup.dat,这不会被打印出来……因为这些都是超链接,所以我需要在末尾加上那个位。另一件事是,在许多情况下,每个软件版本的文件目录路径都不同……因此我们可能会看到:ttp://version/vol1/volvo2,6_1.1.1_Backup.dat和ttp://version/volvo3/volvo2,6_3.0.4_Backup.dat正在打印,而只有第二个文件应带有最新的软件。