Seguindo o conselho do terdon , estou adicionando uma abordagem alternativa usando sed
, principalmente incluí-lo para completude, no entanto, ao contrário do awk '{printf "%s,", $1}'
que agrega enquanto omitir a nova linha , com sed
estamos ativamente substituindo as novas linhas , assim também se encaixaria quando quiséssemos substituir um caractere diferente. É ineficiente embora.
O comando em questão é ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;s/\n/, /;ba'
O comando muito críptico sed
:a;N;s/\n/, /;ba
é realmente bastante simples se desmontado.
sed
transforma a entrada em uma única passagem (em oposição a, por exemplo, ed
, mas ed
geralmente não é incluído por padrão).
O comando ssh não modificado retorna:
[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D"
05
Debian-76-wheezy-64-minimal
a
s
d
f
d
05/04/16
Se adicionarmos N;s/\n//
, obtemos:
[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed 'N;s/\n//'
05Debian-76-wheezy-64-minimal
as
df
d05/04/16
O N
acrescenta a linha de entrada próximo no espaço padrão, o seguinte s/\n//
remove a nova linha no espaço padrão. É por isso que recebemos pares de linhas com novas linhas removidas aqui
Agora, se quisermos que a entrada completa seja enviada para o espaço de padrão, precisamos loop com a ajuda de um rótulo.
[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;s/\n//;ba'
05Debian-76-wheezy-64-minimalasdfd05/04/16
Com :a
, definimos um rótulo, com ba
saltamos incondicionalmente para o rótulo a
.
Então, o que sed ':a;N;s/\n//;ba'
faz é:
- Definir rótulo
a
- Anexar a próxima linha ao espaço padrão (
N
)
- Enviar espaço padrão por meio de
s/\n//
- Volte para
a
Quando não houver uma nova linha para N
anexá-la ao final do script.
Para obtê-lo, precisamos apenas alterar a substituição:
[me@hostname ~]$ ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;s/\n/, /;ba'
05, Debian-76-wheezy-64-minimal, a, s, d, f, d, 05/04/16
Isso não é muito eficiente, especialmente para maior número de linhas, já que o espaço de padrão recebe a linha anexada e enviada através de nosso comando de substituição para cada linha. Seria mais eficiente substituir antes da agregação, mas sed
não pode fazer isso.
Isso se torna muito óbvio se imprimirmos o espaço de padrão após N
anexar a próxima linha (Basta colocar um p
na posição para obter o espaço de padrão atual impresso).
Na saída seguinte, cada 2 linhas representam o espaço de padrão atual (porque a * nova linha ainda está incluída) - pouco antes da substituição da nova linha por s/\n//
:
[me@hostname] ssh test01 "date +%m && hostname && cat asdfd.txt && date +%D" | sed ':a;N;p;s/\n/, /;ba'
05
Debian-76-wheezy-64-minimal
05, Debian-76-wheezy-64-minimal
a
05, Debian-76-wheezy-64-minimal, a
s
05, Debian-76-wheezy-64-minimal, a, s
d
05, Debian-76-wheezy-64-minimal, a, s, d
f
05, Debian-76-wheezy-64-minimal, a, s, d, f
d
05, Debian-76-wheezy-64-minimal, a, s, d, f, d
05/04/16
05, Debian-76-wheezy-64-minimal, a, s, d, f, d, 05/04/16