Como eu combino todas as linhas em um arquivo de texto em uma única linha?

25

Eu quero colocar todas as linhas em um texto em uma linha. Eu sou um iniciante em codificação tentando aprender fazendo. Eu passei quatro horas tentando resolver esse problema. Eu sei que há uma solução simples para esse problema. Aqui está o que eu tenho tentado.

sed -e 'N;s/\n//' myfile.txt #Does nothing

sed -e :a -e N -e 's/\n/ /' -e ta myfile.txt #output all messed up and I can't make head nor tail of the syntax

cat myfile.txt | tr -d '\n' > myfile.txt # Deletes all lines

Aqui está o arquivo de texto:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
GRIFFITH LABORATORIES
SOUTH DUBLIN COUNTY COUNCIL
OFFICE
OFFICE (INDUSTRIAL)
List Rateable
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 Dec 2007
01 Jan 2008"   

Eu não consigo descobrir onde estou errado ...

    
por John 16.07.2012 / 03:25

12 respostas

26

tr como você usou deve funcionar e é o mais simples - você só precisa enviar para outro arquivo . Se você usar o arquivo de entrada como saída, o resultado será um arquivo vazio, como você observou;

cat myfile.txt | tr -d '\n' > oneline.txt

Você precisa se lembrar de alguns editores que terminam uma linha com \r\n . Para esse caso, use

cat myfile | tr -d '\r\n'
    
por ish 16.07.2012 / 04:33
7

Aqui está. É outra solução simples e fácil.

echo $(cat Input.txt) > Output.txt
    
por devWeek 17.10.2014 / 12:22
2

GEDIT:

Pesquise e substitua \n por um espaço ''.
Você pode obter a janela de substituição indo em 'Pesquisar' - > 'Substituir'
ou através do atalho keybpard Ctrl + H

Veja a imagem abaixo:

Seu texto original está nas linhas 1-14.
O resultado está na linha 16.

    
por Parto 20.08.2014 / 13:42
2

Acho que a maneira mais fácil de fazer isso é:

paste -s -d:" " test.txt

link

    
por JConstenla 11.08.2016 / 12:50
1

Tente isso

sed -e :a -e '/$/N; s/\n/\n/; ta' [filename]

link

    
por Anand Rajasekar 20.08.2014 / 13:08
1

MÉTODO SIMPLES

Outro método usando o awk

cat myfile.txt | awk '{print}' ORS=''

Saída:

% bl0ck_qu0te%

Nota:

ORS = '' - > Este é o seu separador de campo, você pode ter quaisquer caracteres entre aspas simples como um separador de campo. Usando este método awk, podemos incluir espaços e todos os caracteres.

Espero que isso possa ajudar!

    
por M.S.Arun 11.02.2018 / 18:19
0

Acho que você estava simplesmente esquecendo que precisava informar ao sed para redirecionar a saída do seu arquivo.txt para o resultado desejado, newfile.txt. Este parece ser o comando que você precisa, mas somente se os arquivos que você está tentando mesclar não forem muito grandes para os buffers do sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt . Crédito para outro fórum aqui , onde eles discutem as capacidades do sed. Eu testei o comando e funcionou para mim.

    
por user76204 16.07.2012 / 03:46
0

Solução pura do bash:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
    
por evilsoup 11.09.2013 / 22:20
0

Se fosse eu, eu apenas o abriria no vim e pressionaria Shift + J algumas vezes.

    
por thomasrutter 20.08.2014 / 13:20
0
vim <your_file>

Digite dentro do vim e pressione Enter:

:% s/\n/ /g
    
por Anatoly 25.10.2016 / 12:05
0

Abordagem em Python:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
    
por Sergiy Kolodyazhnyy 17.01.2017 / 02:44
0

Não há necessidade de colocar o rótulo :a fora da instrução principal, nem a opção -e é necessária; finalmente, o /$/ é supérfluo (cada linha tem um caractere EOL).

Melhorando outras respostas, obtém-se

sed -i ':a; N; s/\n/ /; ta' file

Qual é mais claro se escrito da seguinte forma,

sed -i ':a
        N
        s/\n/ /
        ta' file

O comando funciona da seguinte forma:

  1. N acrescenta a próxima linha ao espaço padrão (multilinha), que já contém a linha atual;
  2. s/\n/ / substitui o caractere de nova linha \n gerado por N por um espaço ;
  3. se a substituição foi bem sucedida vá para a linha de script seguindo o rótulo :a (que é relativo ao script, não ao arquivo a ser editado!), ie go para o passo 1, sem ler outra linha de entrada.

Observe o seguinte:

  • sed lê as linhas do arquivo de entrada uma a uma em ordem, iniciando na primeira linha ;
  • :a é apenas um rótulo, não um comando a ser executado;
  • N é, em princípio, executado em qualquer linha, mas
  • s/\n/ / (em princípio executado em qualquer linha) é bem-sucedido em qualquer linha, mas a última , então
  • ta torna o fim do script acessível somente quando a última linha de entrada é lida (a única linha em que s falha), então
  • nenhuma outra linha de entrada é lida depois que a é lida, a menos que a última seja lida;

Assim, o script basicamente lê na 1a linha de entrada e continua anexando as linhas seguintes uma por uma, cada vez substituindo a nova linha por um espaço; depois que a última linha for anexada (e \n foi alterado em um espaço), N não poderá acrescentar nenhuma linha, s falhará, ta será ignorado, o final do script é atingido, e a declaração implícita p rint é executada no espaço de padrão atual de uma linha do looong.

A opção -i substitui o arquivo de entrada file pelo espaço padrão de 1 linha inteiro.

    
por Enrico Maria De Angelis 16.01.2018 / 22:59