cat
ne 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 awk
pour vous assurer que (cela modifie les fichiers vides):
awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt
Le ENDFILE
bloc sera exécuté après avoir fini de lire l'un des fichiers. Si FNR
est 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 cat
comme 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 -s
test 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 \n
dans les appels à printf
ci-dessus (cela fonctionnera également dans le awk
code).