【问题标题】:Compare fields in line against each other比较行中的字段
【发布时间】:2017-08-18 16:26:22
【问题描述】:

我有一个文件,如下所示;

             ENV_ab 1.1.11.0
             ENV_bb 1.1.11.0
             ENV_cc 1.1.11.0
             ENV_dd 1.1.11.0
             ENV_ff 1.1.11.0
             ENV_gg 1.1.11.0
             ENV1_ab 1.1.11.0
             ENV1_bb 1.1.10.0
             ENV1_cc 1.1.11.0
             ENV1_dd 1.1.11.0
             ENV1_ff 1.1.11.0
             ENV1_gg 1.1.11.0

- 可以看出,每个 ENV 有 6 个版本号。 - 我想要做的是比较每个环境的 6 个版本号。 - 所以,ENV_(ab,bb,cc..etc) 有 6 个版本(1.1.11.0),我希望能够将 ENV_AB,bb,cc,dd,ff,gg 相互比较,如果它们都是同样只打印一个 ENV 及其版本。如果它们不一样,则打印出不一样的部分并打印一次具有相同版本的 env。

如果文件的所有环境都相同,则上述预期输出;

          ENV_ab 1.1.11.0
          ENV1_ab 1.1.11.0

但是,如果在其中一个 env 中有一个 diffrenet 版本(因此将 ENV_bb 版本更改为 1.1.10.0),预期的输出将是; ENV_ab 1.1.11.0 ENV_bb 1.1.10.0 ENV1_ab 1.1.11.0 这可行吗?我研究过关联数组,但它似乎不是解决这个问题的方法。

【问题讨论】:

  • 为什么不打印ENV_bb 1.1.10.0
  • 请提供更多对样本输入和所需输出。还要尝试更详细地解释输出应该如何依赖于输入。
  • 好的示例文件; ENV_aa 1.1.11.0、ENV_bb 1.1.11.0、ENV_cc 1.1.11.0、ENV1_aa 1.1.10.1、ENV1_bb 1.1.10.1、ENV1_cc 1.1.10.1、ENV2_aa 1.1.9.1、ENV2_bb 1.1.9.1、ENV2_cc 1.1.9。 - 每个 ENV 有三个用户(aa、bb 和 cc)。我正在尝试创建的测试是检查每个特定 ENV 的每个用户的版本。如果特定环境的三个用户具有相同的版本,则只需打印任何用户和该环境的版本。输出将是; ENV_aa 1.1.11.0 ENV1_aa 1.1.10.1 和 ENV2_aa 1.1.9.1。
  • 但是,假设新文件文件对于 ENV 中的一个用户具有不同的发布版本;新文件; ENV_aa 1.1.11.0 ENV_bb 1.1.11.0,ENV_cc 1.1.11.0 ENV1_aa 1.1.10.1 ENV1_bb 1.1.10.1 ENV1_cc 1.1.10.1 ENV2_aa 1.1.9.1 ENV2_bb 1.1.10.1 ENV2_cc 1.1.9.1。现在我们可以看到 ENV_bb 与 ENV2_aa 和 ENV2_cc 有不同的版本。期望的输出现在是; ENV_aa 1.1.11.0 ENV1_aa 1.1.10.1 ENV2_aa 1.1.9.1,ENV2_bb 1.1.9.1。
  • 所以第二个评论输出显示,因为一个用户有不同的发布版本,也应该与其他具有相同版本的环境一起打印在输出中。

标签: regex bash awk sed associative-array


【解决方案1】:

如果我明白你想做什么,就是这样:

  1. 使用KEY_dk VERSION 模式定义一个文件组,其中dk 被忽略
  2. 打印第一行,并且只打印该组的那一行。

awk 你可以这样做:

$ awk '{split($1, x, "_")
         if (a[x[1], $2]) next
         a[x[1], $2]=$1 OFS $2 } 
       END{ for (i in a) print a[i]}' file
ENV1_ab 1.1.11.0
ENV_ab 1.1.11.0
ENV1_bb 1.1.10.0

打印的顺序与文件顺序不同,因为关联数组在awk 中是无序的。如果您希望输出与文件顺序相同,只需循环两次文件即可。

【讨论】:

    【解决方案2】:

    非常感谢你们的支持。我已经找到了我的问题的答案,如下所示;

    awk '{split($1,a,""); res[a[1]" "$3]=a[1]""a[2]" "$3; cnt[a[1]" "$3]++;}END {for(i in res) print "输出:" res[i]}' 文件

    -它的作用是单独检查 ENV(X)_(y) 版本(因此检查所有 ENV1 版本),并且将只打印一行重复,如果其中一个不是,也将打印版本与其他人匹配。

    I.E.我有一个包含以下内容的文件;

        <Input File>
        ENV_aa 1.1.11.0
        Env_bb 1.1.11.0
        Env_cc 1.1.10.0
        Env1_aa 1.1.10.0
        Env1_bb 1.1.10.0
        Env1_cc 1.1.10.0
        <Input File>
    
        Output;
        ENV_aa 1.1.11.0
        Env_cc 1.1.10.0
        Env1_bb 1.1.10.0
    
    • 从上面可以看出,对于 ENV,其中一个版本与该 ENV 的其他用户不同。因此,代码将打印不同版本以及重复版本之一。这很有用,因为它会告诉我用户在数据库中的版本。所以现在我会注意到环境用户是否有任何版本不同。

    再次感谢大家的支持,我是这个行业的新手,感谢大家的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      相关资源
      最近更新 更多