Ich habe eine output.txt vom Ausführen eines Shell-Skripts wie folgt:
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016
Die Textdatei enthält mehrere Einträge Zeile für Zeile auf dieselbe Weise. Ich möchte diese Werte wie folgt in Spalten drucken: Dateiname, Status und Zeitstempel:
Filename Status Timestamp
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2 Sat Nov 12 03:00:09 2016
command-line
bash
scripts
text-processing
linux09
quelle
quelle
abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016
. Ich habe Ihre Frage so bearbeitet, dass sie mit dem von Ihnen angegebenen Beispiel übereinstimmt. Fühlen Sie sich frei, einen Rollback durchzuführen, aber bitte beachten Sie, dass Sie wirklich klären müssen, was genau Sie wollen - Spaltenwerte oder durch Kommas getrennte WerteAntworten:
Mit
paste
:Dadurch werden der Inhalt der durch Zeilenumbrüche getrennten Datei als Spalten und drei durch Tabulatoren getrennte Spalten pro Zeile ausgegeben.
Hinzufügen der Kopfzeile:
Wenden Sie sich an
column
:Beispiel:
quelle
echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
Sie könnten awk verwenden:
Die Ausgabe ist möglicherweise nicht so hübsch:
Sie können
%s\t
stattdessen eine durch Tabulatoren getrennte Ausgabe verwenden.NR % 3
ist Null (und falsch) für jede dritte Zeile, daher werden die anderen Zeilen mit einem Leerzeichen nach ihnen anstelle einer neuen Zeile gedruckt.next
Startet gerade die nächste Iteration.1
unverändert gedruckt , gefolgt von einer neuen Zeile, da sie nicht mit dem ersten Block übereinstimmt.quelle
Es gibt auch
rs
(BSD r e s hape Dienstprogramm):Im Speziellen,
So
oder (um den Header hinzuzufügen)
quelle
Der Vollständigkeit halber können Sie dies
sed
auch tun mit :1iFilename\tStatus\tTimestamp
fügt die Kopfzeile vor Zeile 1 einN;N
Liest zwei weitere Zeilen in den Musterpuffer und ergibt insgesamt 3 durch neue Zeilen getrennte Zeileny/\n/\t/
Ersetzt alle Zeilenumbrüche durch Tabulatoren im MusterpufferDie
i
,N
undy
sed Befehle sind hier dokumentiert .quelle
Mit AWK oder Perl und natürlich Python ist es immer möglich, etwas für die Textverarbeitung zu kochen, was diese Antwort bietet.
Als Einzeiler:
Als mehrzeiliges Skript
Die Grundidee hier ist, die Skripteingabe über stdin zu geben (unter Verwendung der Shell-Umleitung
<
, obwohl auch eine Pipe verwendet werden kann). Das Skript verwendet Registerkarten, um die Felder zu trennen, obwohl Leerzeichen auch für eine "fein abgestimmte" Ausgabe verwendet werden könnten.Beispielausgabe anhand des von OP bereitgestellten Eingabebeispiels:
quelle