cat
kann keine Daten ausgeben, die nicht in den Dateien vorhanden sind. Wenn eine Datei leer ist, enthält sie nicht einmal ein Zeilenumbruchzeichen, um eine leere Zeile als Ausgabe bereitzustellen.
Sie können sicherstellen, dass die Dateien mindestens ein einzelnes Zeilenumbruchzeichen enthalten.
So verwenden Sie GNU, awk
um sicherzustellen, dass (dies ändert die leeren Dateien):
awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt
Der ENDFILE
Block wird ausgeführt, nachdem das Lesen einer der Dateien abgeschlossen ist. Wenn FNR
Null ist, haben wir keine Zeilen in der Datei gesehen, daher fügen wir eine einzelne neue Zeile ein. Das Skript fährt dann mit der nächsten Datei fort.
Sie können dann cat
wie in der Frage verwendet verwenden.
Alternativ, ohne die Dateien zu ändern, verwenden Sie GNU awk
anstelle von cat
:
awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt
Dies macht die gleiche Art der Erkennung leerer Dateien wie oben, druckt jedoch die neue Zeile in die Standardausgabe und nicht in die Datei. Das 1
am Ende könnte durch ersetzt werden { print }
und bewirkt, dass alle Daten in den nicht leeren Dateien ausgegeben werden.
Alternativ eine Shell-Schleife (sollte in jeder POSIX-Shell funktionieren):
for name in ./2[0-8]_SumActive.txt; do
if [ -s "$name" ]; then
cat "$name"
else
printf '\n'
fi
done
Der -s
Test ist wahr, wenn die Datei vorhanden ist und eine Größe größer als Null hat.
Wenn Sie möchten [Blank]
, dass die Literalzeichenfolge für leere Dateien ausgegeben wird, fügen Sie diese Zeichenfolge einfach vor \n
den printf
obigen Aufrufen ein (dies funktioniert auch im awk
Code).