Arrays 关联列的脚本
我有一个包含定义的文件,其中变量名指向ip地址。我需要一个脚本(bash/python/similor)来输出每个ip地址,后面是定义它的每个变量的列表,以及列表中有多少变量 输入: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
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脚本,我不得不将它与linuxsort
和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]
,答案已更新。请重试。