
Ich habe eine Datei, die so aussieht:
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
Darunter möchte ich die Daten mit dem folgenden Code anzeigen lassen
#!/bin/bash
for timestamp in (1262300400..1264978800..600)
do
date -d @"$timestamp" '+%Y %m %d %H %M %S';
done | grep -Ev '[15]0 00$' > file.txt
Wenn Sie wissen möchten, wie ich diesen Code erhalten habe, lesen Sie bitte die FrageDatumsbereich mit Minuten
Die Schwierigkeit bei dieser Frage liegt im letzten Teil "> file.txt"
. Der aktuelle Code überschreibt, was bereits in der Datei „file.txt“ steht. Ich möchte, dass diese Schleife die Daten unter den Notizen der Datei „file.txt“ druckt, sodass sie beispielsweise ab der 5. Zeile oder so mit dem Schreiben beginnt.
Die gewünschte Ausgabe wäre also
**********************************
Some notes are here
Year Month Day Hour Minute Second
. . . . . . . . . . . . . . . . .
2010 01 01 00 00 00
2010 01 01 00 20 00
2010 01 01 00 30 00
2010 01 01 00 40 00
2010 01 01 01 00 00
Antwort1
Die Umleitung mit >
würde die Ausgabedatei erstellen, zu der Sie umleiten, oder, falls sie bereits existiert, sie auf die Größe Null kürzen. Alle Schreibvorgänge in die Datei würden am Anfang der Datei beginnen und die Daten würden sequenziell geschrieben. Dies istnichtwas willst du tun.
Die Umleitung mit >>
würde die Ausgabedatei erstellen oder, falls sie bereits existiert,nichtkürzen Sie es. Alle Schreibvorgänge in die Datei würden am Ende der Datei erfolgen. Das ist, was Sie tun möchten.
Außerdem liegt ein Syntaxfehler im Code vor. Ich gehe davon aus, dass Sie in der Schleife eine Klammererweiterung verwenden wollten:
#!/bin/bash
for timestamp in {1262300400..1264978800..600}; do
date -d @"$timestamp" '+%Y %m %d %H %M %S'
done | grep -v '[15]0 00$' >>file.txt
Dies ist auch einäußerstlangsame Schleife, die date
sehr oft aufgerufen wird (4465 Mal, um genau zu sein; die Anzahl der 10-Minuten-Zeitsegmente in einem 31-Tage-Monat). Um die Dinge zu beschleunigen, nutzen Sie die Tatsache, dass GNU date
aus einer Datei lesen kann (hier stellen wir die Zeitstempel auf der Standardeingabe bereit, die date
mit gelesen wird -f -
):
#!/bin/bash
printf '@%s\n' {1262300400..1264978800..600} |
date -f - '+%Y %m %d %H %M %S' |
grep -v '[15]0 00$' >>file.txt
Dies würde in einer Sekunde oder weniger laufen.
Ich habe auch -E
aus dem Aufruf entfernt grep
, da Sie keinen erweiterten regulären Ausdruck verwenden.