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

28

Quero colocar todas as linhas de um texto em uma linha. Sou iniciante em codificação tentando aprender fazendo. 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 # Não faz nada

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt #output tudo bagunçado e eu não consigo entender a sintaxe

cat myfile.txt | tr -d '\ n'> myfile.txt # Exclui todas as linhas

Aqui está o arquivo de texto:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
LABORATÓRIOS GRIFFITH
CONSELHO DO SUL DE DUBLIN COUNTY
ESCRITÓRIO
ESCRITÓRIO (INDUSTRIAL)
Lista tributável
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 dez 2007
01 Jan 2008 "   

Não consigo descobrir onde errei ...

John
fonte

Respostas:

31

trcomo você o 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 lembrar que alguns editores encerram uma linha com \r\n. Nesse caso, use

cat myfile | tr -d '\r\n'
ish
fonte
Obrigado pela ajuda, mas ainda não está funcionando. Eu sei que é algo básico e simples. O comando que você deu excluiu todas as linhas. Vou postar o arquivo 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES SOUTH DUBLIN COUNTY COUNTY OFFICE OFFICE (INDUSTRIAL) Lista tributável 2 Pineview Industrial Estate Firhouse Road Knocklyon 31 de dezembro de 2007 01 de janeiro de 2008
John
@ John: Qual é o resultado ou erro?
Ish
Eu ia postar editando minha resposta. Depois de usar o comando, o arquivo ficou em branco. Parecia assim no terminal "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Obrigado novamente.
John John
@ John: Você não pode usar o mesmo nome de arquivo de saída! (ver resposta). Por favor, tentecat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish
1
Uma maneira melhor de fazer isso seria tr -d '\n' <input.txt > output.txt- que evita o uso inútil do gato e usa menos um tubo desnecessário.
precisa saber é
8

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

echo $(cat Input.txt) > Output.txt
αғsнιη
fonte
2
Eu não posso acreditar que isso funcionou, impressionante
mchid
echo `cat Input.txt` > Output.txt funciona também, apenas outra
variância
Se houver mais de UM espaços em branco (espaço, tabulação, nova linha etc.) em uma única divisão, eles serão substituídos por um espaço.
iBug
Essa é uma boa solução, mas, no meu computador, achei que demorava cerca de três vezes o tempo de trabalho que a trsolução.
LS
3

MÉTODO SIMPLES

Outro método usando awk,

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

Saída:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Lista Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 dez 200701 jan 2008 "

Nota:

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

Espero que isso possa ajudar!

MSArun
fonte
1
ORS é o separador de registros de saída. OFS é o separador de campos de saída. Veja thegeekstuff.com/2010/01/… ouman awk
Elder Geek
3

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

Melhorando outras respostas, obtém-se

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

O que é mais claro se escrito da seguinte maneira,

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

O comando funciona da seguinte maneira:

  1. N anexa a próxima linha ao espaço do padrão (multilinha), que já contém a linha atual;
  2. s/\n/ /substitua o caractere de nova linha \ngerado por Ncom um espaço ;
  3. tavai para a linha de script após o rótulo :a , desde que a substituição na etapa 2 tenha sido bem-sucedida , ou seja , se a substituição ocorreu, a execução salta para a etapa 1 sem "atingir" o final do script, ou seja , sem ler outra linha de entrada.

Observe o seguinte;

  • sedlê as linhas do arquivo de entrada uma por uma em ordem, começando na 1ª 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, exceto a última , portanto
  • tatorna o final do script acessível somente quando a última linha de entrada é lida (a única linha em que sfalha);
  • nenhuma linha de entrada adicional é lida no espaço do padrão depois que a é lida nele, a menos que a última seja lida, mas não há mais linha a ser lida e o pcomando implícito é executado.

Portanto, o script basicamente lê a 1ª linha de entrada e continua anexando as seguintes linhas, uma a uma, sempre substituindo a nova linha por um espaço; depois que a última linha é anexada (e \nalterada em um espaço), Nnão é possível anexar nenhuma linha, sfalha, taé ignorada, o final do script é atingido e a pinstrução rint implícita é executada no espaço padrão atual de 1 linha mais longo .

A -iopção substitui o arquivo de entrada filecom todo o espaço padrão de 1 linha.

Enrico Maria De Angelis
fonte
2

GEDIT:

Pesquise e substitua \npor um espaço ''.
Você pode obter a janela substituir, indo para 'Pesquisar' -> 'Substituir'
ou através do keybpard atalho Ctrl+H

Veja a captura de tela abaixo:

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

insira a descrição da imagem aqui

Parto
fonte
2

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

paste -s -d:" " test.txt

http://ss64.com/bash/paste.html

JConstenla
fonte
0

Eu acho que você estava simplesmente esquecendo que precisava dizer ao sed para redirecionar a saída do yourfile.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 são grandes demais para buffers de 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.


fonte
1
Na verdade, o sed com o -icomutador modificará o arquivo original embutido , então não há necessidade de enviar para outro arquivo. Tenha cuidado!
Ish
Eu tentei sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 Jan 2008addustrial Estate sed -i: a -e N -e / s n / / '-e ta reval_details.asp? Pno = 500214.txt sed: não é possível encontrar o rótulo para pular para a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to um' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: não é possível ler s / \ n / /: Não existe esse arquivo ou diretório #Any ideas.
John
@ Mik Eu ainda não tive sorte, mas obrigado pela resposta.
John John
Copiei e colei o seu texto em um editor de texto e salvei o arquivo, em seguida, usei o meu comando sed e ele apareceu em uma linha quando aberto no nano; no entanto, se você abrir o arquivo usando cat no terminal, ele será quebrado e não parecerá apenas uma linha, talvez seja isso que esteja acontecendo. Além disso, você não precisa de um 'before sed e acho que adicionou outros elementos desnecessários ao comando acima, então tente sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt A linha é tão longa que aparecerá quebrada na tela, a menos que você tenha um monitor com mais de 30 polegadas!
@Mik Cheers para o post. Digitei meus dados em um editor de texto que os salvei e executei 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' e funcionou. perfeitamente. Aleluia. Digitei 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' e todas as linhas, exceto a primeira, tinham um espaço adicionado ao início da linha. Agradeço o esforço que você fez, mas acho que vou passar para a oitava e tentar processar os dados lá.
John John
0

Solução de bash pura:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
evilsoup
fonte
0

Se fosse eu, eu iria abrir no vim e pressionar Shift+ Jalgumas vezes.

thomasrutter
fonte
0
vim <your_file>

Digite dentro do vim e pressione Enter:

:% s/\n/ /g
Anatoly
fonte
0

Abordagem Python:

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

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
Sergiy Kolodyazhnyy
fonte