como inserir espaço entre dígitos individuais em um arquivo?

5

Meus dados parecem:

$ cat input
1212103122
1233321212
0000022221

Eu quero que a saída se pareça com:

$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1

Eu tentei:

sed -i 's// /g' input > output

mas não funciona.

Alguma sugestão?

    
por zara 09.08.2016 / 23:40

4 respostas

4

Aqui você está:

sed 's/\(.\{1\}\)/ /g' input > output

E se você quiser salvar as alterações no local:

sed -i 's/\(.\{1\}\)/ /g' input

Como funciona:

s/\(.\{1\}\)/\ /g adicionará um espaço após cada 1 caractere.

Por exemplo, se você quiser um arquivo de saída como:

12 12 10 31 22
12 33 32 12 12
00 00 02 22 21

Você pode editar minha resposta para:

sed -i 's/\(.\{2\}\)/ /g'

Por isso, irá adicionar um espaço, após cada 2 caracteres.

Além disso, / / é igual a /& e adicionará um espaço em branco. Por exemplo, para adicionar três: / / ou /& / . Você tem muito mais opções para usar. Sed é uma ferramenta super poderosa.

Além disso sim, como @ Law29 mencionou, isso deixará um espaço no final de cada linha se você não remover, para removê-los ao adicionar espaços você pode adicionar um s/ $// até o fim da solução dada, para fazer isso:

sed 's/./& /g; s/ $//'

Espero que isso possa ajudar.

    
por 09.08.2016 / 23:48
9

Isso funcionou para mim:

sed 's/./& /g' input > output

$ cat input
1212103122
1233321212
0000022221

$ cat output
1 2 1 2 1 0 3 1 2 2 
1 2 3 3 3 2 1 2 1 2 
0 0 0 0 0 2 2 2 2 1 
    
por 09.08.2016 / 23:57
4

Você tem a opção -i , que edita o arquivo no lugar. Isso pode ter impedido você de encontrar a solução certa.

Seu problema é que você está tentando corresponder uma string vazia, que sed não permitirá. Em vez disso, combine qualquer caractere e substitua-o pelo mesmo caractere seguido por um espaço. Isso vai deixar você com um espaço no final de cada linha, que você pode remover com outro sed.

$ cat input 
1212103122
1233321212
0000022221
$ sed -e 's/./& /g' -e 's/ $//' input > output
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
$ 
    
por 09.08.2016 / 23:58
4

Esta é uma opção awk :

awk -F '' '{$1=$1}1' input > output

O princípio de funcionamento é:

  • definindo um separador de campo vazio -F '' , dividimos os registros de entrada (linhas) em caracteres individuais

  • avaliando $1=$1 forçamos o registro a ser reconstruído com o separador de campo de saída padrão (que é um espaço único)

  • 1 é verdadeiro, então imprima o resultado


Um truque similar no perl:

perl -F'' -alne 'print join " ", @F' input > output

Para ilustrar:

$ awk -F '' '{$1=$1}1' input
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
    
por 10.08.2016 / 00:50

Tags