关联列的脚本

时间:2019-03-08 04:00:48

标签: arrays bash sorting

我有一个由定义组成的文件,其中变量名指向IP地址。我想要一个脚本(bash / python / like)输出每个ip地址,然后输出定义了每个变量的列表以及列表中有多少变量。

输入:

SELECT DO_TM_TASK('moveout', 'public.test');

输出

define alpha    192.168.1.1
define beta     192.168.1.3
define gamma    192.168.1.2
define delta    192.168.1.1
define epsilon  192.168.1.3
define zeta     192.168.1.1
define eta      192.168.1.3
define theta    192.168.1.1

我是在bash中使用关联数组来执行此操作还是有更好的方法?我尝试这样做,但最终只能得到一个bash脚本,该脚本必须与linux 192.168.1.1:alpha,delta,zeta,theta:4 192.168.1.3:beta,epsilon,eta:3 192.168.1.2:gamma:1 sort命令结合使用,但仍然无法完全正确。

为糟糕的标题而道歉,但我无法以更好的方式来表述,因此随时可以编辑。

2 个答案:

答案 0 :(得分:0)

第一个解决方案: 。能否请您尝试以下操作。即使您在关键字define(第一个字段)之后和最后一个字段(IP地址)之间有多个值,这也应该能够具有这些值,尽管您的示例中没有多个3个字段,但我已经注意了(以防您的Input_file中也包含3个以上字段)。

awk '{$1="";val=$NF;$NF="";gsub(/^ +| +$/,"");a[val]=a[val]?a[val]","$0:$0;b[val]++}  END{for(i in a){print i":"a[i]":"b[i]}}' Input_file

或在此处添加非单一衬里形式的解决方案。

awk '
{
  $1=""
  val=$NF
  $NF=""
  gsub(/^ +| +$/,"")
  a[val]=a[val]?a[val]","$0:$0
  b[val]++
}
END{
  for(i in a){
      print i":"a[i]":"b[i]
  }
}'   Input_file


第二个解决方案: 上面的第一个解决方案不会给出相同的IP顺序(它们存在于Input_file中),该解决方案将处理输出中IP的顺序应该与Input_file的存在相同。

awk '{$1="";val=$NF;$NF="";gsub(/^ +| +$/,"")} !c[val]++{d[++count]=val} {a[val]=a[val]?a[val]","$0:$0;b[val]++}  END{for(i=1;i<=count;i++){print d[i]":"a[d[i]]":"b[d[i]]}}'  Input_file

OR(添加上述解决方案的一个非衬里形式)。

awk '
{
  $1=""
  val=$NF
  $NF=""
  gsub(/^ +| +$/,"")
}
!c[val]++{
  d[++count]=val
}
{
  a[val]=a[val]?a[val]","$0:$0
  b[val]++
}
END{
  for(i=1;i<=count;i++){
      print d[i]":"a[d[i]]":"b[d[i]]
  }
}'  Input_file

答案 1 :(得分:0)

使用awk:

awk '
  /^define/{
    a[$3]++
    b[$3]=(b[$3]?b[$3]",":"")$2
  }
  END {
    for(i in a)
      print i,b[i],a[i]
  }' OFS=: file

a是一个数组,其中包含每个不同IP的计数。
b是一个数组,其中包含一个字符串,其中包含每个IP的所有关键字。在每个关键字之间插入一个逗号。

在解析结束时,将打印包含IP的索引,并打印两个数组的内容。

OFS=:将输出字段分隔符设置为: