Решение Bash:
#!/bin/bash
keys=()
declare -A map
while read line; do
key=$(echo ${line} | cut -d \| -f1 | sed -e 's/[[:upper:]].*$//')
if [[ -z "${map[$key]}" ]]; then
keys+=(${key})
map[$key]="${line}"
else
map[$key]+=",${line}"
fi
done
for key in ${keys[*]}; do
echo "${key}"
echo "${key}:${map[$key]}"
done
exit 0
Возможно, решение Perl приемлемо и для OP:
#!/usr/bin/perl
use strict;
use warnings;
my @keys;
my %map;
while (<>) {
chomp;
my($key) = /^([[:lower:]]+)/;
if (not exists $map{$key}) {
push(@keys, $key);
$map{$key} = [];
}
push(@{ $map{$key} }, $_);
}
foreach my $key (@keys) {
print "$key\n";
print "$key:", join(",", @{ $map{$key} }), "\n";
}
exit 0;
Тестирование с заданным вами значением:
$ perl dummy.pl <dummy.txt
power
power:powerOf|creating new file|failure,powerAp|powerof server|failureof file
creat
creat:creatEd|new file creating|failure
ОБНОВЛЕНИЕ после того, как OP повторно изложил исходную проблему.Решение для первого цикла, который включает в себя только 2-й столбец ввода вместо всей строки:
message=$(echo ${line} | cut -d \| -f2)
if [[ -z "${map[$key]}" ]]; then
keys+=(${key})
map[$key]="${message}"
else
map[$key]+=",${message}"
fi
Проверка с заданным входом:
$ perl dummy.pl <dummy.txt
power
power:creating new file,powerof server
creat
creat:new file creating