Um comando bash gera isso:
Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active
Eu gostaria de canalizá-lo para algo para torná-lo assim:
Runtime Name: vmhba2:C0:T1:L14 Group State: active
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]
ou seja, remova qualquer outra linha nova
Eu tentei, ... |tr "\nGroup" " "
mas ele removeu todas as novas linhas e comeu algumas outras cartas também. obrigado
tr
é inteiramente baseado em caracteres: você pediu a tr para remover novas linhas e todos os 'G', 'r', 'o', 'u' e 'p'.Respostas:
não pode testar agora, mas
deveria fazê-lo
fonte
paste -d ' ' - -
irá adicionar um espaço em vez se necessário)-
? Graçaspaste
é utilizado para concatenar as linhas correspondentes de ficheiros:paste file1 file2 file3 ...
. Se um dos argumentos "arquivo" for "-", as linhas serão lidas a partir da entrada padrão. Se houver 2 argumentos "-", colar terá 2 linhas de stdin. E assim por diante. Veja a página do manual .Uma possibilidade é:
Se o número da linha for divisível por 2, termine com uma nova linha, caso contrário, termine com um espaço.
(Testado em: CentOS 6, GNU Awk 3.1.7)
Usando sed (veja explicação ):
Leitura adicional:
fonte
Se você deseja usar
sed
, não há razão para ler o arquivo inteiro na memória. Você pode mesclar todas as outras linhas como esta:Use qualquer caractere que desejar em vez do espaço.
Aqui está outra maneira de usar o awk:
Ele
if/else
lida com o caso em que há um número ímpar de linhas no arquivo. Sem ele, a última linha ímpar é impressa duas vezes. Caso contrário, para comparação, você pode fazer:fonte
awk '{printf "%s", $0; $0=""; getline; print " " $0}'
A maneira mais idiomática de fazer isso
awk
é a seguinte:Emite:
Para explicá-lo, precisamos definir cada uma das variáveis internas:
RS
separador de registros. O padrão é\n
(nova linha).ORS
separador de registros de saída. O padrão é\n
(nova linha).FS
separador de campo. O padrão é(espaço).
NR
número de registro.Como o separador de registros padrão é a nova linha, um registro é, como padrão, uma linha.
NR%2
é o módulo deNR/2
, de modo que será ou0
ou1
.0
para linhas1
pares e linhas ímpares.var=condition?condition_if_true:condition_if_false
é o operador ternário.Todos juntos, dizendo
ORS=NR%2?FS:RS
que estamos definindo o separador de registros de saída:2k + 1
, ou seja, em linhas pares, os separadores de registros de saída serão configurados paraFS
, ou seja, um espaço.2k
, ou seja, em linhas ímpares, os separadores de registros de saída serão configurados paraRS
, ou seja, uma nova linha.Dessa forma, as linhas ímpares terminam com um espaço, que é então unido à próxima linha. Após essa linha, uma nova linha é impressa.
Mais informações no Idiomatic awk .
fonte
Isso funciona para mim no Linux:
Isso substitui um espaço vazio por um caractere de nova linha; você deve escapar do caractere de nova linha para que as coisas funcionem corretamente.
fonte
Na festança:
fonte
Se Perl é uma opção:
perl -pe 's/\n/ / if $. % 2 == 1' file
s/\n/ /
substitui nova linha por espaço$.
é o número da linhafonte
Que tal usar
grep
?fonte