paulo1205
(usa Ubuntu)
Enviado em 01/09/2018 - 15:20h
O algoritmo é o seguinte:
1. Inicialize seus dados:
1.1. crie um
buffer de texto com conteúdo vazio;
1.2. posicione a posição de leitura no início do arquivo.
2. Se o fim do arquivo tiver sido alcançado,
2.1. se o
buffer não estiver vazio,
2.1.1. imprima o conteúdo do
buffer ;
2.2. encerre o programa.
3. Leia o conteúdo da próxima linha do arquivo (extirpando a quebra de linha ao final, se isso for relevante na ferramenta que você estiver usando para implementação).
4. Se a linha contiver o padrão de início de uma linha nova,
4.1. se o
buffer não estiver vazio,
4.1.1. imprima o conteúdo do
buffer , e
4.2. atribua a linha linha lida ao
buffer .
5. Caso contrário (em 4),
5.1. acrescente o conteúdo da linha lida ao final do
buffer (usando o separador que você achar conveniente).
6. Volte ao passo 2.
Você pode fazer isso usando apenas o Bash.
buffer="" # 1.1
exec 3</caminho/do/arquivo.txt # 1.2
while read -u 3 linha; do # 2 e 3 (se chegou ao fim, a leitura interrompe o while)
if [[ "$linha" ~= '^WC\.' ]]; then # 4
[[ -n "$buffer" ]] && echo "$buffer" # 4.1 e 4.1.1
buffer="$linha" # 4.2
else # 5
buffer="$buffer; $linha" # 5.1.
done # 6
[[ -n "$buffer" ]] && echo "$buffer" # 2.1 e 2.1.1
exec 3<&- # Desfaz associação de arquivo (1.2, acima)
Com o
awk , isso poderia ser feito mais ou menos do seguinte modo.
BEGIN { buffer="" } # 1
{ # 2 e 3 (modo normal de execução do awk, de ler processar linhas enquanto elas existirem)
if(match($0, "^WC\\.")){ # 4
if(length(buffer)){ print buffer } # 4.1 e 4.1.1
buffer=$0 # 4.2
}
else { buffer=buffer "; " $0 } # 5 e 5.1
} # 6
END { if(length(buffer)){ print buffer; } } # 2.1 e 2.1.1
Pode ser que existam formas “criativas” usando
pipelines com
awk ,
sed ou
tr , mas eu não creio que sejam muito melhores, tanto em clareza quanto em eficiência, do que o algoritmo acima.