adicionar nova linha após cada final de conteúdo do arquivo ao mesclar vários arquivos

1

Eu tenho escrito shell script para mesclar o conteúdo do arquivo diferente Eu criei diretórios f1, f2, d1, d2 e arquivos sob eles, eu preciso mesclar o conteúdo de todos os arquivos: comand is

(find /home/ah5024331/f1 /home/ah5024331/f2  /home/ah5024331/d1  /home/ah5024331/d2 /home/ah5024331/f1 /home/ah5024331/f2  -type f | xargs -i cat {} ) > t.txt

a saída é:

--this is new text from f1 ----
--this is text from f2 ------this is new text from d1 ------this is new text from d2 -----this is new text from f1 ----

Eu preciso adicionar nova linha após cada final de arquivo gostar:

--this is new text from f1 ----
--this is text from f2
------this is new text from d1 
------this is new text from d2 
-----this is new text from f1 ----

Como fazer isso?

Qualquer ajuda seria apreciada com antecedência.

user
fonte

Respostas:

0

Tente isto:

#!/bin/bash
for f in $(find /home/ah5024331/f1 /home/ah5024331/f2 \
    /home/ah5024331/d1 /home/ah5024331/d2 -type f)
do
    cat "$f" >> t.txt
    echo >> t.txt
done

Isso adicionará uma nova linha após o final de cada arquivo, no entanto, se algum desses arquivos já tiver uma nova linha no final, você verá uma linha extra em branco na saída (como mencionado por @mnmnc nos comentários ).

jweyrich
fonte
Por quê echo "FOOBAR" >> t.txt e não apenas echo >> t.txt?
Arkadiusz Drabczyk
Não funcionará com alguns arquivos que já possuem \n no fim. Isso criará uma nova linha dupla em alguns casos. Para fazê-lo funcionar perfeitamente, você teria que lembrar do último caractere colocado na saída e verificar ao alternar para o próximo arquivo, eu acho.
mnmnc
Pelo que vejo ela perguntou: I need to add new line after every end of file like (...)
Arkadiusz Drabczyk
@ArkadiuszDrabczyk ops, eu interpretei mal a pergunta. Vou simplificá-lo como você sugeriu. Obrigado por trazer isso.
jweyrich
Eu tentei código não adicionando nova linha após cada arquivo
user
0

Crie um arquivo fictício com uma nova linha.

echo -n "" > /tmp/newline.txt

Agora execute seu script como abaixo.

(find /home/ah5024331/f1 /home/ah5024331/f2  /home/ah5024331/d1  /home/ah5024331/d2 /home/ah5024331/f1 /home/ah5024331/f2  -type f | xargs -i cat {} /tmp/newline.txt ) > t.txt
sureshraju
fonte
Não está adicionando nova linha
user
Qual SO Unix você está executando este script? Remova a opção -n e tente novamente. Você pode colar essa saída para que tenhamos uma imagem melhor.
sureshraju
0

Usando o GNU Parallel, é assim:

(find ...  -type f | parallel -j1 cat {}';'echo ) > t.txt

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh. E também pode substituir muitos for loops como neste caso.

Se você tiver 32 tarefas diferentes que deseja executar em 4 CPUs, uma maneira direta de paralelizar é executar 8 tarefas em cada CPU:

Simple scheduling

Paralelamente, o GNU Parallel gera um novo processo quando um termina - mantendo as CPUs ativas e, portanto, economizando tempo:

GNU Parallel scheduling

Instalação

Se o GNU Parallel não for empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos fazendo isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Saber mais

Veja mais exemplos: http://www.gnu.org/software/parallel/man.html

Assista aos vídeos de introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Percorra o tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscreva-se na lista de e-mail para obter suporte: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
fonte