it-swarm.com.de

Entfernen Sie ungerade oder gerade Zeilen aus einer Textdatei

Ich muss ungerade Zeilen in einer Textdatei entfernen, um ein Downsampling durchzuführen. Ich habe diesen Befehl gefunden,

awk 'NR%2==0' file

es werden jedoch nur die ungeraden Zeilen im Terminal gedruckt. Wie kann man sie wirklich entfernen?

Ich mag gerade oder ungerade nicht wirklich, ich möchte, dass sie aus der Datei entfernt oder in einer anderen Datei gedruckt werden. Dies druckt sie nur im Terminal.

36
SamuelNLP

awk

Der % Ist ein Moduloperator und NR ist die aktuelle Zeilennummer, daher gilt NR%2==0 Nur für gerade Zeilen und ruft die Standardregel für diese Zeilen auf ({ print $0 }). Um also nur die geraden Zeilen zu speichern, leiten Sie die Ausgabe von awk in eine neue Datei um:

awk 'NR%2==0' infile > outfile

sed

Sie können dasselbe mit sed erreichen. devnulls answer zeigt, wie es mit GNU sed gemacht wird. Nachfolgend finden Sie Alternativen für Versionen von sed, die nicht über den Operator ~ Verfügen:

Behalte ungerade Zeilen

sed 'n; d' infile > outfile

Behalte gerade Linien

sed '1d; n; d' infile > outfile
72
Thor

Mit GNU sed:

sed -i '0~2d' filename

um die geraden Zeilen aus der Datei zu entfernen.

So entfernen Sie ungeradzahlige Zeilen:

sed -i '1~2d' filename

Die Option -i Bewirkt, dass die Änderungen direkt in der Datei gespeichert werden.

Zitat aus dem Handbuch:

`FIRST~STEP'
     This GNU extension matches every STEPth line starting with line
     FIRST.  In particular, lines will be selected when there exists a
     non-negative N such that the current line-number equals FIRST + (N
     * STEP).  Thus, to select the odd-numbered lines, one would use
     `1~2'; to pick every third line starting with the second, `2~3'
     would be used; to pick every fifth line starting with the tenth,
     use `10~5'; and `50~0' is just an obscure way of saying `50'.
13
devnull

Konzentrieren Sie sich nicht auf das Negative (Entfernen von Linien), sondern auf das Positive (Auswählen von Linien). Also statt I need to remove odd lines du solltest nachdenken I need to select even lines und dann ist die Lösung einfach:

awk '!(NR%2)' file

Wenn Sie das Ergebnis in einer neuen Datei speichern möchten:

awk '!(NR%2)' file > newfile

oder zurück zum Original:

awk '!(NR%2)' file > newfile && mv newfile file
5
Ed Morton

Dies könnte für Sie funktionieren (GNU sed):

 sed -n 'p;n' file # keep odd
 sed -n 'n;p' file # keep even
3
potong

Hier ist ein awk Beispiel, um zwei neue Dateien zu erstellen, die jeweils die ungeraden und geraden Zeilen enthalten:

awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt
3
twalberg

Perl-Lösung zum Drucken von Abgleichen in eine neue Datei:

Perl -lne 'print if $. % 2 == 0' infile > outfile

Ändern Sie == 1 In == 0, Um Quoten auszudrucken.

$. Ist die Zeilennummer

Hält nur Abschlüsse in der Originaldatei:

Perl -i -lne 'print if $. % 2 == 0' infile

Wie oben, erstellt jedoch eine Sicherungsdatei mit dem Namen infile.bak:

Perl -i.bak -lne 'print if $. % 2 == 0' infile
1
Chris Koknat