2016-07-28 32 views
3

Von this question, fand ich die split Utility, die eine Datei und teilt es in gleichmäßig große Stücke. Standardmäßig gibt es diese Chunks in neue Dateien aus, aber ich möchte, dass sie in stdout ausgegeben werden, getrennt durch einen Zeilenumbruch (oder ein beliebiges Trennzeichen). Ist das möglich?Send output von `split` Dienstprogramm zu stdout

Ich versuchte cat testfile.txt | split -b 128 - /dev/stdout

die split: /dev/stdoutaa: Permission denied mit dem Fehler fehlschlägt.

Betrachtet man den Hilfetext, so scheint es, teilt dies teilt/Dev/stdout als Präfix für den Dateinamen, nicht zu/dev/stdout selbst zu schreiben. Es gibt keine Option zum direkten Schreiben in eine einzelne Datei mit einem Trennzeichen. Gibt es eine Möglichkeit, split in dies zu tun, oder gibt es ein anderes Dienstprogramm, das das gewünschte Verhalten erreicht?

+0

http://stackoverflow.com/a/38630451/2836621 –

+1

'cat Datei | split '->' Kaz

Antwort

5

Es ist nicht genau klar, was Sie tun wollen, aber vielleicht die --filter Option split wird helfen:

--filter=COMMAND 
      write to shell COMMAND; file name is $FILE 

Vielleicht können Sie das direkt verwenden. Zum Beispiel wird dies eine Datei 10 Byte zu einem Zeitpunkt lesen, jeden Brocken durch den tr Befehl übergeben:

split -b 10 --filter "tr [:lower:] [:upper:]" afile 

Wenn Sie wirklich einen Stream auf stdout emittieren mögen, die Trennlinien zwischen Brocken hat, könnten Sie tun, so etwas wie:

split -b 10 --filter 'dd 2> /dev/null; echo ---sep---' afile 

Wenn afile ist eine Datei in meinem aktuellen Verzeichnis, das wie folgt aussieht:

the quick brown fox jumped over the lazy dog. 

Dann wird der obige Befehl bewirkt:

the quick ---sep--- 
brown fox ---sep--- 
jumped ove---sep--- 
r the lazy---sep--- 
dog. 
---sep--- 
+0

Das letzte Beispiel ist das Verhalten, für das ich mich entschieden habe. Obwohl das funktioniert, fand ich es schließlich einfacher, zu erlauben, dass split neue Dateien erzeugt, wie es normalerweise der Fall ist, dann diese durchlaufen und dann löschen. – ecapstone

0

Nein, das Dienstprogramm nicht alles auf die Standardausgabe schreiben. Die standard specification davon besagt ausdrücklich, dass die Standardausgabe nicht verwendet wird.

Wenn Sie split verwendet haben, müssen Sie die erstellten Dateien verketten und ein Trennzeichen dazwischen einfügen.

Wenn Sie nur ein Trennzeichen jedes N ten Zeile einfügen möchten, können Sie GNU verwenden sed:

$ sed '0~3a\-----\' file 

Dies fügt eine Zeile ----- enthält jede dritte Zeile.

1

Von Info-Seite: `--filter = COMMAND‘ Mit dieser Option, anstatt einfach nur zu jeder Ausgabedatei schreiben, Schreib durch ein Rohr an den angegebenen Shell-Befehl für jede Ausgabedatei. COMMAND sollte die $ FILE-Umgebungsvariable verwenden, die für jeden Aufruf des Befehls auf einen anderen Ausgabedateiname festgelegt ist.

split -b 128 --filter='cat ; echo ' inputfile 
1

Hier ist eine Möglichkeit, es zu tun. Sie erhalten jeweils 128 Zeichen in die Variable "var".

Sie können Ihr bevorzugtes Trennzeichen zum Drucken verwenden oder zur weiteren Verarbeitung verwenden.

#!/bin/bash 

cat yourTextFile | while read -r -n 128 var ; do 
    printf "\n$var" 
done 

Sie es können, wie unten auf der Kommandozeile verwenden:

while read -r -n 128 var ; do printf "\n$var" ; done < yourTextFile 
+1

Sie können die 'cat' entfernen und stattdessen' Kusalananda

+0

Danke, aktualisiert. –