Wie kann ich nur ungeradzahlige Zeilen von einer Datei in eine andere kopieren?

Antworten:

12

Sie könnten verwenden sed:

sed '2~2d' file > new-file

Dies beginnt in der zweiten Zeile, stimmt mit jeder zweiten Zeile danach überein und löscht die übereinstimmenden Zeilen aus dem Stream. Die verbleibenden ungeraden Zeilen werden in eine neue Datei umgeleitet.

Zanna
quelle
" beginnt in der zweiten Zeile, stimmt mit jeder zweiten Zeile danach überein " Wären das nicht alle geraden Zahlen?
RonJohn
2
@ RonJohn Ja, es stimmt mit den geradzahligen Zeilen überein und löscht sie aus dem Stream, wobei die ungeradzahligen Zeilen intakt bleiben. Wir könnten sed '1~2!d'aber warum ein Byte verschwenden?
Zanna
2
@Zanna aber warum ein Byte verschwenden - gesprochen wie ein echter Code-Golfer ! In der Tat könnten Sie ein weiteres Byte mit speichern sed 'n;d'.
Digitales Trauma
1
@DigitalTrauma für diejenigen von uns, die es nicht wissen sed: Druckt n;dden Musterraum (die aktuelle Zeile?) Und ersetzt den Musterraum durch die nächste Zeile, löscht ihn sofort und startet den nächsten Zyklus: gnu.org/software/sed/manual/ sed.html # sed-befehlsliste
jfs
9
awk 'NR%2' file > newFile

NR ist die Nummer der aktuellen Zeile; NR%2= ungerade Linie


quelle
1
Liegt das daran, dass die Regel ausgelöst wird, wenn das Ergebnis NR%2gleich 1 ist?
RonJohn
1
@ RonJohn, ja. NR%2 = 1 = Truedas löst die Standardaktion aus:print
1
@JJoao: Minor nitpick: Die Awk-Sprache hat keinen wirklichen "wahren" Wert. Stattdessen wird jede Zahl ungleich Null in bedingten Anweisungen als wahr ausgewertet.
David Foerster
@ DavidFoerster, danke, ich stimme vollkommen zu. (Mein vorheriger Kommentar war zu stark vereinfacht die Nicht-Null, nicht leere Zeichenfolge)