比较相互排列的字段

时间:2017-08-18 16:26:23

标签: regex bash awk sed associative-array

我有一个文件如下;

             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。

如果所有envs文件相同,则上述预期输出;

          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 这可行吗?我已经研究了关联数组,但它似乎不是解决方案。

2 个答案:

答案 0 :(得分:0)

IF 我明白你要做什么,就是这样:

  1. 使用KEY_dk VERSION模式定义一个组并忽略dk的文件
  2. 打印第一行,只打印该组的那一行。
  3. 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中是无序的。如果您希望输出与文件顺序相同,只需循环文件两次。

答案 1 :(得分:0)

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

awk'{split($ 1,a,“”); res [a [1]“”$ 3] = a [1]“”a [2]“”$ 3; cnt [a [1]“”$ 3] ++;} END {for(i in res)print“output:”res [i]}'file

- 这样做是单独检查ENV(X)_(y)版本(因此检查所有ENV1版本相互之间)并且只打印一行重复项,如果其中一行不是,也会打印版本与其他人相匹配。

即。我有一个包含以下内容的文件;

    <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的其他用户不同。因此,代码将打印不同的版本以及其中一个重复版本。这很有用,因为它会告诉我用户在DB中有哪些版本。所以现在我会注意到env的用户是否有任何版本不同。

再一次,伙计们,感谢您的支持,我是这个行业的新手,并感谢所获得的支持。