Datei:
Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred
Erwartete Ausgabedatei:
Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90
Ich möchte, dass die Ausgabe so aussieht: Jede zweite Zeile wird gelöscht, aber es wird keine Lücke zwischen den Zeilen geben.
text-processing
sed
awk
pmaipmui
quelle
quelle
grep -v "No error occurred" file
dieser Befehl funktionieren ... was @paul geantwortet hat. In der Ausgabedatei gibt es keine Zeilen, die diesen Teil "Kein Fehler aufgetreten" enthalten.Antworten:
Mit
sed
:Mit POSIX
awk
:Wenn Sie älter sind
awk
(wieoawk
), benötigen Sie:Mit
ex
:bearbeitet die Datei direkt.
g
Markieren Sie einen globalen Befehl/$/
Finde alle Zeilen+d
Löschen Sie die nächste Zeilewq!
Alle Änderungen speichernDieser Ansatz hat dasselbe Ideal wie der
sed
Ansatz. Löschen Sie jede nächste Zeile des aktuellen Zeilenanfangs ab Zeile 1.Mit
perl
:und
perl6
:quelle
n\;d
statt'n;d'
einen wertvollen Charakter zu sparen , sondern die Logik geht aus dem Fenster , wenn Sie unnötig die Verwendung von-e
Schaltern und eine Datei Umleitung<
!sed -e 'n;d'
, speichern Sie einen Charakter.n
Befehl zum Schreiben des Musterbereichs in die Standardausgabe, falls-n
verwendet. Ersetzen Sie dann den Musterbereich durch die nächste Zeile. Hier wird jede ungerade Zeile gedrucktn
, gerade Zeile dann in den Musterraum eingelesen, aber sofort perd
Befehl gelöscht.Das Beheben dieses Problems durch Löschen jeder zweiten Zeile kann fehleranfällig sein (z. B. wenn der Prozess manchmal zwei sinnvolle Zeilen statt einer generiert). Vielleicht ist es besser, den Müll herauszufiltern:
Es kann als Filter ausgeführt werden, Sie können hier weitere Garbage Patterns hinzufügen und das Ergebnis verbessern.
quelle
Auf die Frage mit GNU
sed
:löscht jede zweite Zeile, aber ich möchte Filterzeilen nach Inhalt anbieten:
oder mit dem gleichen Ergebnis
quelle
grep Data
grep -v 'No error'
Hier ist ein Weg mit
sed
:Ein anderer Weg mit GNU
sed
:Ausgabe von obigen Befehlen:
quelle
shortest way using sed
?g
Kommando?sed -n 'p;n'
ist genug.g
. g aus dem Befehl entfernt. :)Sie können versuchen mit
awk
:oder Sie können nur Zeilen drucken, die Folgendes enthalten
Data inserted
:quelle
Eine andere Antwort, du könntest vi / vim benutzen!
Wenn Ihre Datei beispielsweise 500 Zeilen lang ist, geben Sie Folgendes ein
Und dann schreiben und Typ beenden
Oder wenn etwas schief geht und Sie nicht sparen möchten:
Erläuterung:
quelle
Das geht ganz anders:
Dies setzt voraus, dass die ungeraden Zeilen keine Tabulatoren enthalten. In diesem Fall müssen Sie ein anderes Trennzeichen auswählen, z. B.
:
hier:quelle
sed
mit einer riesigen Datei (z. B. 20-mil-Zeilen) durchzuführen . Wie auch immer, +1, aber um Kopfschmerzen zu vermeiden, wählen Sie ein Trennzeichen, das in einer Textdatei wahrscheinlich nicht vorkommt, wie$'\002'
...seq 100000000 > 100mil.txt
. Diepaste|cut
Lösung war nach etwa 7,5 Sekunden fertig, während diesed
Lösung fast 12 Sekunden benötigte . Scheint wiederholbar zu sein.grep
ist zwar am schnellsten. Ubuntu 14.04 mit Standard GNU Tools.paste
+cut
sind stark für ihren Job optimiert, so dass es nicht überraschend ist, dass ihre Kombination verdammt schnell ist ...Eine andere Option (kürzer)
quelle
sed n\;d
, das Hinzufügen-e
ist nur meine Gewohnheit.Es löst auch das Problem, obwohl es etwas langsamer ist:
quelle