Como obter uma linha vazia mesclando textos?

3

Existe uma maneira de ter o comando

cat *tab > newfile.tab

insere uma linha em branco entre todos os arquivos que ela mescla?

    
por Billy Matlock 25.04.2017 / 17:28

2 respostas

3

Aproveite a for construct:

GLOBIGNORE=newfile.tab
for f in *tab; do cat "$f"; echo; done >newfile.tab

Expandido:

GLOBIGNORE=newfile.tab
for f in *tab; do 
    cat "$f"; echo
done >newfile.tab
  • GLOBIGNORE=newfile.tab é para excluir newfile.tab do shell globbing, pois esse é o nosso arquivo de saída

  • for f in *tab itera os arquivos que terminam em tab

  • cat "$f" envia o conteúdo do arquivo

  • echo adiciona uma nova linha

  • O descritor de arquivo do redirecionamento >newfile.tab é mantido aberto pela duração de for , ou seja, o arquivo newfile.tab é aberto-fechado uma vez

Além disso, você pode usar printf para fazer a formatação uma vez:

for f in file.txt*; do printf '%s\n\n' "$(<"$f")"; done

Expandido:

for f in file.txt*; do 
    printf '%s\n\n' "$(<"$f")"
done
    
por heemayl 25.04.2017 / 17:33
3

Se você não se importar com uma linha extra em branco após o último arquivo, poderá usar sed , por exemplo,

sed -s '$G' *.tab > newfile.tab

(isso usa uma extensão de sed do GNU -s que trata os arquivos de entrada separadamente; portanto, $G duplica a última linha de cada arquivo).

Se você se importa com a linha extra, você pode canalizá-la por meio de outro sed :

sed -s '$G' *.tab | sed '$d' > newfile.tab

Como alternativa, com awk

awk 'FNR == 1 && NR != 1 {print ""} 1' *.tab > newfile.tab
    
por steeldriver 25.04.2017 / 17:48