cat
não pode enviar dados que não existem nos arquivos. Se um arquivo estiver vazio, ele não terá nem mesmo um caractere de nova linha para fornecer uma linha vazia como saída.
Você pode ter certeza de que os arquivos contenham pelo menos um único caractere de nova linha.
É assim que você usa o GNU awk
para garantir que (isso modifica os arquivos vazios):
awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt
O bloco ENDFILE
será executado depois de terminar a leitura de qualquer um dos arquivos . Se FNR
for zero, nunca vimos nenhuma linha no arquivo, então inserimos uma única nova linha nela. O script continua com o próximo arquivo.
Você pode usar cat
como fez na pergunta.
Como alternativa, sem alterar os arquivos, usando o GNU awk
em vez de cat
:
awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt
Isso faz o mesmo tipo de detecção de arquivos vazios como acima, mas imprime a nova linha na saída padrão em vez de no arquivo. O 1
no final pode ser substituído por { print }
e fará com que todos os dados nos arquivos não vazios sejam exibidos.
Como alternativa, um loop de shell (deve funcionar em qualquer shell POSIX):
for name in ./2[0-8]_SumActive.txt; do
if [ -s "$name" ]; then
cat "$name"
else
printf '\n'
fi
done
O teste -s
será verdadeiro se o arquivo existir e tiver um tamanho maior que zero.
Se você quiser que a string literal [Blank]
seja enviada para arquivos vazios, basta inserir essa sequência na frente de \n
nas chamadas para printf
acima (isso também funcionará no código awk
).