catne peut pas sortir des données qui n'existent pas dans les fichiers. Si un fichier est vide, il n'a même pas de caractère de nouvelle ligne pour fournir une ligne vide en sortie.
Vous pouvez vous assurer que les fichiers contiennent au moins un seul caractère de nouvelle ligne.
Voici comment vous utilisez GNU awkpour vous assurer que (cela modifie les fichiers vides):
awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt
Le ENDFILEbloc sera exécuté après avoir fini de lire l'un des fichiers. Si FNRest zéro, nous n'avons jamais vu de lignes dans le fichier, nous y insérons donc une seule nouvelle ligne. Le script continue ensuite avec le fichier suivant.
Vous pouvez ensuite utiliser catcomme vous l'avez fait dans la question.
Alternativement, sans changer les fichiers, utilisez GNU awk au lieu de cat :
awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt
Cela fait le même type de détection de fichiers vides que ci-dessus, mais imprime la nouvelle ligne sur la sortie standard plutôt que sur le fichier. Le 1à la fin pourrait être remplacé par { print }et entraînera la sortie de toutes les données dans les fichiers non vides.
Alternativement, une boucle shell (devrait fonctionner dans n'importe quel shell POSIX):
for name in ./2[0-8]_SumActive.txt; do
if [ -s "$name" ]; then
cat "$name"
else
printf '\n'
fi
done
Le -stest sera vrai si le fichier existe et a une taille supérieure à zéro.
Si vous souhaitez que la chaîne littérale [Blank]soit sortie pour les fichiers vides, insérez simplement cette chaîne devant \ndans les appels à printfci-dessus (cela fonctionnera également dans le awkcode).