Continua imprimindo o valor de encanamento com retorno de retorno

0

Eu tenho um script bash em que faço uma filtragem com o comando sed e, em seguida, canalizo o resultado para gzip para zipar a saída novamente. A saída filtrada tem o formato <id>,<title>,<bool (0 or 1)> . Eu gostaria de imprimir o id, mas com um retorno de carro à direita em vez de uma nova linha, para que todos eles sejam impressos um sobre o outro, pois o id está aumentando. Minha abordagem foi algo como:

<chained sed commands> \
| tee >(sed -re "s/^([0-9]+).*/\r/") | gzip -c > outputfile.gz

Isso, no entanto, adiciona uma nova linha em cada linha e não produz o resultado desejado de apenas imprimir em uma linha.

    
por Alexander Simko 07.09.2018 / 09:54

1 resposta

0

Você precisa gerar o indicador de progresso para stderr para que ele não acabe nos dados compactados com gzip. Eu usaria perl para isso:

<chained sed commands> | perl -pe 'print STDERR "$1\r" if /^(\d+)/' | gzip -c > outputfile.gz

perl -p significa criar um loop automático que imprime cada linha de entrada, possivelmente modificada. O -e define a expressão para executar dentro do loop.

A expressão corresponde a um número no início da linha e, se encontrado, imprime isso para stderr com um retorno de carro à direita. A entrada é passada para a saída a ser gzipada.

Uma variação que pode funcionar melhor visualmente é substituir o valor da instrução de impressão por "\r$1 "\ . Isso deixa o cursor no final, os espaços extras sobrescrevem quaisquer dígitos das linhas anteriores, caso o ID atual seja menor que o ID anterior.

    
por 07.09.2018 / 10:06