Arrays 关联列的脚本

Arrays 关联列的脚本,arrays,bash,sorting,Arrays,Bash,Sorting,我有一个包含定义的文件,其中变量名指向ip地址。我需要一个脚本(bash/python/similor)来输出每个ip地址,后面是定义它的每个变量的列表,以及列表中有多少变量 输入: 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 19

我有一个包含定义的文件,其中变量名指向ip地址。我需要一个脚本(bash/python/similor)来输出每个ip地址,后面是定义它的每个变量的列表,以及列表中有多少变量

输入:

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
输出

192.168.1.1:alpha,delta,zeta,theta:4
192.168.1.3:beta,epsilon,eta:3
192.168.1.2:gamma:1
我是在bash中使用关联数组还是有更好的方法?我尝试过这样做,但最终只得到了一个bash脚本,我不得不将它与linux
sort
uniq
命令相结合,但仍然无法完全正确地完成

很抱歉我的标题太差劲了,但我无法用更好的方式表达出来,所以请随意编辑。

第一个解决方案:请尝试以下内容。即使在关键字
define
(第1个字段)之后和最后一个字段(IP地址)之间有超过1个值,也应该能够有这些值,尽管您的示例没有超过3个字段,但我已经注意到了这一点(如果您的输入文件中也有超过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


第二种解决方案:上述第一种解决方案不会给出相同的IP顺序(它们存在于输入文件中),此解决方案将处理输出中的IP顺序,并应与输入文件的顺序相同

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
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第一个解决方案:请尝试以下内容。即使在关键字
define
(第一个字段)之后和最后一个字段(IP地址)之间有超过1个值,这些值也应该能够存在,虽然您的示例没有超过3个字段,但我已经处理好了(如果您的输入文件中也有超过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


第二种解决方案:上述第一种解决方案不会给出相同的IP顺序(它们存在于输入文件中),此解决方案将处理输出中的IP顺序,并应与输入文件的顺序相同

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
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使用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=:
使用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=:
将输出字段分隔符设置为

欢迎来到SO,很好,你在帖子中添加了清晰的输入样本和预期输出样本,我们鼓励所有用户也在帖子中添加他们的努力,所以请这么做,在这个伟大的网站上愉快地学习。欢迎来到SO,很好,你添加了清晰的s在你的帖子中有大量的输入和预期输出的样本,我们鼓励所有用户也在他们的帖子中加入他们的努力,这样做吧,很高兴在这个伟大的网站上学习。非常感谢你的快速回答(我之前看到过,但直到现在才回复)。非常感谢你的快速回答(我之前看到过,但直到现在才回复)。抱歉,但它似乎对我不太起作用。我只得到每个IP的最后一次出现。不过计数器是正确的。@歇斯底里老师有一个
b[$3]的打字错误
,答案已更新。请重试。很抱歉,这对我来说似乎不太管用。我只得到每个IP的最后一次出现。不过计数器是正确的。@癔症医生有一个拼写错误,
b[$3]
,答案已更新。请重试。