我有一个由定义组成的文件,其中变量名指向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
命令结合使用,但仍然无法完全正确。
为糟糕的标题而道歉,但我无法以更好的方式来表述,因此随时可以编辑。
答案 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=:
将输出字段分隔符设置为:
。