Вы можете использовать
awk -F"[ |]+" 'BEGIN {ORS=""} {
print $1;
dt=$2;
for(i=3;i<=NF;i++) {
if ($i~/^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+$/) {
sub(/\..*/, "", $i);
print "," dt " " $i;
}
}
}'
# => e5c1640ed000f865fb3acf675be3cda4,26/06/2018 14:43:41,26/06/2018 14:45:41
См. онлайн демо .
Предполагается, что первое поле всегда должно сохраняться, а второе всегда является датой, которая будет «повторяться» перед каждым найденным значением времени.
Разделитель поля: [ |]+
, 1 или более пробелов или каналов. BEGIN {ORS=""}
помогает выводить результаты в одной строке. print $1;
печатает первое поле, dt=$2;
сохраняет дату в переменной, затем мы перебираем поля, начиная с третьего (for(i=3;i<=NF;i++)
), и если значение поля соответствует шаблону <2-digits>:<2-digits>:<2-digits>.<1+digits>
(/^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+$/
, то удаляем все текст, начинающийся с .
и заканчивающийся значением sub(/\..*/, "", $i);
, и печать ,
+ дата + пробел и текущее значение поля.