Если perl
- ваш вариант, попробуйте следующее:
perl -ne '
s/\s+$//;
if (/^segment/) {
push(@ary, $_);
print(join("\n", @ary), "\n");
undef @ary;
} elsif (/^(\S)\S*\s+is/) {
push(@ary, $_);
$index{$1} = $#ary;
} elsif (/^\+(\S)\s+(\S+)/) {
$ary[$index{$1}] .= " $2";
}
' file.txt
output:
segment
bob is working eating drinking
linda is studying
john is reading listening
segment
john is driving
linda is cooking washing
bob is sleeping snoring
segment
-n
Опция perl
указывает на итерациювходной файл как awk -n
. s/\s+$//
удаляет завершающие символы новой строки и пробелы, если таковые имеются. - Часть
if (/^segment/)
сбрасывает содержимое в @ary
и сбросьте массив для следующего сегмента. - Следующая часть
elsif (/^(\S)\S*\s+is/)
совпадает со строкой, подобной bob is working
, затем добавьте строку в @ary
, запомнив индекс массива с начальным, как "b". - Следующая часть
elsif (/^\+(\S)\s+(\S+)/)
совпадает со строкой, подобной +b eating
, затем добавьте действие eating
к элементу @ary
, проиндексированному с помощью" b ".
Я мог бы написать сценарий также с awk
, но сценарий был бы длиннее.Я предпочитаю perl
за его гибкость (и странность).
Надеюсь, это поможет.