in Datei schreiben ab bestimmter Zeile

in Datei schreiben ab bestimmter Zeile

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 datesehr 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 dateaus einer Datei lesen kann (hier stellen wir die Zeitstempel auf der Standardeingabe bereit, die datemit 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 -Eaus dem Aufruf entfernt grep, da Sie keinen erweiterten regulären Ausdruck verwenden.

verwandte Informationen