Zeigen Sie leere Zeilen mit dem Befehl cat an


11

Ich habe eine Liste von files.txt unten:

-rw-rw-r-- 1 root dev 11 May 16 12:18 20_SumActive.txt  
-rw-rw-r-- 1 root dev 11 May 16 12:18 22_SumActive.txt  
-rw-rw-r-- 1 root dev  7 May 16 12:18 24_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 26_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 28_SumActive.txt  

Ausgabe:

kpgmeddev01> cat 2[0-8]_SumActive.txt   
Sum: 47760  
Sum: 72000  
Sum: 0

So erhalten Sie die Ausgabe wie folgt:

Sum: 47760  
Sum: 72000  
Sum: 0  
[Blank]  
[Blank]  

Brauchen Sie Anleitung.


Enthalten die Dateien jemals mehr als eine Zeile?
Roaima

Nein, nur 1 Zeile
Wenige

1
Äh, als Sie geschrieben haben, [Blank]haben Sie diese 7 Zeichen gemeint oder wollten Sie eine leere Zeile angeben?
Roaima

1
Indem Sie keine Katze benutzen. Beschränke dich nicht.
Strg-Alt-Delor

Antworten:


20

catkann 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, awkum sicherzustellen, dass (dies ändert die leeren Dateien):

awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt   

Der ENDFILEBlock wird ausgeführt, nachdem das Lesen einer der Dateien abgeschlossen ist. Wenn FNRNull 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 catwie 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 1am 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 -sTest 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 \nden printfobigen Aufrufen ein (dies funktioniert auch im awkCode).


2
@Fewong Gut! Wenn dies Ihr Problem löst, ziehen Sie bitte in Betracht , die Antwort zu akzeptieren .
Kusalananda

@Fewong: Oder akzeptiere eine andere Antwort, die dir noch besser hilft - es ist eine gute Praxis, jeder Zeitzone eine Chance zu geben, damit es keine Eile gibt.
MSalters

@Fewong Auf jeden Fall keine Eile. Stephané hat auch eine kurze und kompakte Lösung geschrieben, die vielversprechend aussieht.
Kusalananda

@Kusalananda, danke und ich habe getestet, dass es funktioniert hat.
Wenige

16

Mit perl

perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt

Wenn am Ende ein Zeilenumbruchzeichen hinzugefügt wird, wird eine leere Zeile für leere Dateien ausgegeben, aber auch eine neue Zeile für nicht leere Dateien hinzugefügt, bei denen solche fehlen (und die am Ende in einer einzelnen Zeile mit verkettet werden cat).


netter Vorschlag
erTugRul

13

(Dies ist nicht genau das, was Sie fragen, aber :) In solchen Situationen bevorzuge ich head

$ head -z 2[0-8]_SumActive.txt
==> 21_SumActive.txt <==
Sum: 47760  
Sum: 72000  
Sum: 0  

==> 22_SumActive.txt <==

==> 25_SumActive.txt <==

==> 28_SumActive.txt <==

Normalerweise ist es das, was Sie wollen. Wenn nicht, ist sedes später einfach


12

Mit xargsund grepSie könnten etwas versuchen wie:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]

4
Vielleicht nicht die schnellste Lösung (Forken einer Shell für jede Datei), aber bisher nur eine, die tatsächlich funktioniert, wenn Sie Millionen solcher Dateien im aktuellen Verzeichnis haben (ohne Shell-Erweiterungen und ohne ARGV-Limit).
Matija Nalis

1
@ MatijaNalis: Sehr wahr! Aber Sie würden sich wirklich nicht für 5 Dateien interessieren.
FloHimself

6

Angenommen, [Blank]Sie meinen damit wörtliche Leerzeilen, sollte dies funktionieren:

paste -s 2[0-8]_SumActive.txt

6

Sie können jede Datei testen, um festzustellen, ob sie die Länge Null hat, bevor Sie versuchen, ihren Inhalt anzuzeigen:

for f in 2[0-8]_SumActive.txt;
do
    [[ -s "$f" ]] && awk 1 "$f" || echo '[Blank]'
done

Ich habe awk 1 "$f"statt cat "$f"weil awkgarantiert, um die Ausgabe einer Datei mit einem Zeilenumbruch zu beenden.

Wenn Sie in Ihrer Frage beabsichtigt haben, dass [blank]dies kein Literal, sondern nur eine Leerzeile sein soll, können Sie dies mithilfe des obigen Codes implementieren und '[Blank]'am Ende der echoAnweisung entfernen .


5

Ich gehe davon aus, dass Ihre Dateien 26_SumActive.txt und 28_SumActive.txt leer sind und Sie leere Zeilen benötigen, wenn Sie deren Inhalt anzeigen

Dazu können Sie einfach Ihre Dateiliste durchlaufen und deren Inhalt überprüfen. Wenn die Datei leer ist, geben Sie eine leere Zeile ein.

[ -s FILE ] True, wenn FILE vorhanden ist und eine Größe größer als Null hat.

$ for i in $(ls 2[0-8]_SumActive.txt) ; do  cat $i;  if [ ! -s $i ]; then echo -e ""; fi; done
Sum: 47760  
Sum: 72000  
Sum: 0  
[ Blank Line]
[ Blank Line ]

1
Oder if [ -s $i ]; then cat $i; else echo -e ""; fi;. Immer noch +1 für einen einfachen Test mit nur Standard-Shell-Funktionalität.
MSalters

2
Oder einfach cat "$i"; test -s "$i" || echo- keine Notwendigkeit für diese unhandlichen ifoder nicht tragbaren echoFlaggen.
Toby Speight

1
cat 2[0-8]_SumActive.txt -

where - ermöglicht cat das Lesen von Standardeingaben.

Nach dem Anzeigen des Inhalts Ihrer Dateien wartet cat auf Ihre Eingabe. Sie können Ihre gewünschte Eingabe vornehmen, indem Sie die Eingabetaste für wörtliche Leerzeichen oder [Leerzeichen] drücken, wenn Sie dies wünschen. Nach jeder Eingabe drücken Sie die Eingabetaste. Sobald alle Eingaben vorgenommen wurden, drücken Sie ^ D (Strg + D) und Sie sind fertig.

PS: Für jeden Eingang erhalten Sie einen entsprechenden Ausgang.

cat 2[0-8]_SumActive.txt - 4[0-8]_SumActive.txt

Auf diese Weise können Sie Leerzeichen oder etwas anderes zwischen zwei Ausgabesequenzen einfügen.


Auf dieser Basis können Sie genauso gut catals Lösung anbieten und dem OP erlauben, was sie wollen.
Roaima
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.