1-е решение: Не могли бы вы попробовать следующее.Это должно иметь возможность иметь эти значения, даже если у вас есть более 1 значения после ключевого слова define
(1-е поле) и между последним полем (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
2-е решение: Приведенное выше 1-е решение НЕ даст тот же порядок IP-адресов (которые они присутствуют во входном файле), это решение позаботится о том, чтобы последовательность 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
ИЛИ (добавление формы не одного вкладыша вышеуказанного решения).
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