Juntar arquivos de texto (Problemas com o cat) [RESOLVIDO]

1. Juntar arquivos de texto (Problemas com o cat) [RESOLVIDO]

Steve
Steve

(usa Slackware)

Enviado em 09/02/2019 - 06:53h

Amigos, pesquisando na Internet, todo mundo é unânime em indicar o cat para juntar arquivos!
Mas esse comando não funciona direito comigo!

TESTE BÁSICO:
arquivo1.txt
1
2
3

arquivo2.txt
a
b
c

USAR, os comandos abaixo, não funcionam. Pois os 2 arquivos não possuem linhas em branco, e NEM PODEM POSSUIR:
cat * > arquivos-juntos.txt
ou
cat * >> arquivos-juntos.txt

RESULTADO RUIM:
1
2
3a
b
c

Ou seja, se os arquivos não possuem uma linha em branco no final, o comando cat bagunça tudo! Ou seja, não dá pra usar!
Meu Objetivo é juntar uma pasta com 100 arquivos, o problema é que muitos deles PODEM não ter linhas em branco no final deles!
Alguém tem alguma idéia?


  


2. MELHOR RESPOSTA

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 09/02/2019 - 11:04h

Em princípio o cat funciona sim.

Aqui deu certo testando com arquivos normais criados por editores de texto comuns (kate, nano e vim).
$ cat 1.txt
1
$ cat a.txt
a
$ cat *.txt > final.txt
$ cat final.txt
1
a

O que provavelmente está acontecendo no seu caso é que os seus arquivos são gerados sem adicionar o "fim de linha" (EOL) ou são arquivos txt do Windows, que possuem um EOL diferente do Unix/Linux. Veja um teste (a opção -n do echo remove o EOL):
$ echo -n "1" > 1.txt
$ echo -n "a" > a.txt
$ cat *.txt > teste.txt ; cat teste.txt

1a

Para solucionar este "problema" sugiro adicionar o EOL em todos os arquivos com o comando:
$ sed -i '$ s/$/\n/' arquivo.txt 

Crie um loop para aplicar o comando em todos os arquivos...
$ for arq in `ls -1 *.txt`; do sed -i '$ s/$/\n/' $arq; done 


3. Re: Juntar arquivos de texto (Problemas com o cat) [RESOLVIDO]

Matheus
pylm

(usa Gentoo)

Enviado em 09/02/2019 - 10:17h

Tentei exatamente o teu método e funcionou perfeitamente.
Qual tua versão do cat? Eu usei a 8.30



4. Re: Juntar arquivos de texto (Problemas com o cat)

Hugo Cerqueira
hrcerq

(usa Outra)

Enviado em 09/02/2019 - 11:37h

Olá.

Embora as preocupações com versão do cat e tipo de fim de linha usado sejam totalmente válidas, vou partir do pressuposto de que seu problema é de fato que existem arquivos sem caractere newline (nova linha) no final. Nesse caso, usar o comando (cat *) não é o mais indicado, porque ele vai concatenar os arquivos como estão, sem adicionar qualquer tratamento.

Você precisaria fazer um pequeno script pra tratar isso. Poderia usar o printf, por exemplo:

for arq in $(ls -1); do printf "$(<$arq)\n"; done 


Atenção: usei o comando ls pra listar todos os arquivos, mas atente-se para o conteúdo do diretório onde vai executar esse comando. Ele deve ter apenas os arquivos que vai concatenar. Caso contrário, deve alterar o comando ls para procurar um padrão de arquivos ou para ler os arquivos de uma lista. Ou ainda, pode substituir o ls por um outro comando pra fazer essa listagem, como find, por exemplo.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/


5. Re: Juntar arquivos de texto (Problemas com o cat)

Steve
Steve

(usa Slackware)

Enviado em 09/02/2019 - 12:19h

[quote]hrcerq escreveu:
Nesse caso, usar o comando (cat *) não é o mais indicado, porque ele vai concatenar os arquivos como estão, sem adicionar qualquer tratamento.
Você precisaria fazer um pequeno script pra tratar isso. Poderia usar o printf, por exemplo:
for arq in $(ls -1); do printf "$(<$arq)\n"; done 


Você entendeu o problema! Então não existe nenhuma forma do cat então fazer um APPEND? Pq pensei que ele deveria fazer isso. Ou seja, na hora de juntar o arquivo, ele fazer isso em uma linha desocupada!

Explicando para os outros: Galerinha eu uso o cat 8.30 explicando o que expliquei inicialmente.
O Problema está no caracter LF = Line Feed vou mostrar como fica de verdade, embora os editores comuns não vão mostrar isso, pq é um caracter invisível. O Geany consegue mostrar!

Ou seja, a última linha não possue o LF ou seja, ela também é a última linha! Não havendo nenhuma linha em branco abaixo dela. O Windows e muitos editores colocam mais uma linha ao gravar o texto, ou no mínimo alguns colocam o LF ao término do texto. Mas quem cria os arquivos é um script, e ele não coloca isso. O Script é um binário já compilado que eu não tenho acesso. Só recebo os arquivos prontos, com 100 a 200 mil linhas, e são muitos arquivos para eu abri-los e ficar colocando uma linha final neles!

arquivo1.txt
1LF
2LF
3

arquivo2.txt
aLF
bLF
c

Voltando ao hrcerq Se esse é o caso de não existir solução simples, vc está dizendo que a única forma é eu recorrer a um Script que edite esses arquivos em lote primeiro antes de eu juntá-los é isso?
Ou pode existir tipo, eu apenas com o comando cat, adicionar mais alguma coisa nele para que ele insira a linha adicional após ler cada arquivo antes de juntar?


6. Re: Juntar arquivos de texto (Problemas com o cat) [RESOLVIDO]

Steve
Steve

(usa Slackware)

Enviado em 09/02/2019 - 12:26h

[quote]Ryuk escreveu: Para solucionar este "problema" sugiro adicionar o EOL em todos os arquivos com o comando:
$ sed -i '$ s/$/\n/' arquivo.txt 

Gostei de sua idéia, e seu comando com o SED funciona perfeitamente, fiz um teste aqui rápido assim:
sed -i '$ s/$/\n/' *.txt2 

Esse seu comando, adicionou quebra de linhas a todos os arquivos da máscara .txt2 rapidamente, dessa forma torna possivel usar o cat para juntar os arquivos sem riscos de erros!

Vou aproveitar e estudar mais o comando SED



7. Re: Juntar arquivos de texto (Problemas com o cat) [RESOLVIDO]

André Gonçalo
SnwMds

(usa Debian)

Enviado em 09/02/2019 - 14:26h



Se o problema está nos arquivos que não contém uma linha em branco, então adicione uma a cada um dos arquivos usando:

find /usr -type f -name *.txt | while read arquivos; do echo >> $arquivos; done 


Onde: 'find /usr' procura pelos arquivos no diretório especificado, no caso em '/usr'.

Onde: '-type f' específica o tipo de conteúdo com o qual vamos trabalhar, no nosso caso é o 'f', que significa file ou arquivo.

Onde: '-name *.txt' significa que estamos procurando por arquivo com a extensão .txt, no caso de arquivos de texto.

'while read' recebe todo o conteúdo da saída do comando anterior e o transforma em uma variável, no caso a variável '$arquivos'.

Onde: 'echo >> $arquivos' adiciona uma linha em branco a todos os arquivos encontrados. Quando o echo é executado sem parâmetros ou caracteres de texto, ele retorna apenas uma "linha em branco". '>>' adiciona toda a saída do comando anterior sempre na última linha ou no final do arquivo.

Depois de ter adicionado uma linha em branco no final de cada arquivo, tente usar o cat novamente para unir os arquivos:

cat *.txt > NovoArquivo.txt 


Depois você pode usar o sed, awk, sort ou um outro editor de texto para remover as linhas em brancos que ficaram na saída final do arquivo de texto.

Aqui vai um exemplo com o sed:

sed -i '/^$/d' NovoArquivo.txt 







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts