Zeige nur ungerade Zeilen mit cat


27

HALLO,

wahrscheinlich ist das etwas sehr einfaches, aber ich verstehe den Punkt jetzt nicht. In Linux, Shell, eine Textdatei gegeben, wie kann ich so etwas tun, cat Dateiname, so dass ich nur die erste Zeile, die dritte Zeile, 5, 7, 9 und so weiter sehe?

wenn nicht mit cat, mit einem anderen befehl

Vielen Dank

bash 

Antworten:


40

Verwenden von awk:awk 'NR % 2 == 0' filename

Bearbeiten: entfernt {print}, wie in der Antwort von ghostdog74 gezeigt und von Roberto Bonvallet kommentiert.


1
{print}ist die Standardaktion, reicht also awk 'NR % 2 == 0' < myfileaus.

3
@roberto, brauche keine Eingabeumleitung.
user31894

1
Nur als Hinweis werden gerade Zeilen (wobei die erste Zeile 1 ist) und ungerade Zeilen (wenn Sie sich die erste Zeile als 0 vorstellen) angezeigt. Ersetzen Sie 2 == 0mit 2 == 1für das Gegenteil.
14.

13

Oder so ähnlich

sed -n 'p;n' filename

Erläuterungen finden Sie in der Manpage für sed.


Dies ist die portable sedVersion, die mir durch den Kopf ging.
Chris Johnsen

1
Sie können sed -n '1d;p;n'zum Beispiel problemlos Zeilen überspringen, die gerade sind
kisp

7

Verwenden Sie sed:

sed -n 1~2p filename

1
Dies ist eine GNU-Erweiterung. Es funktioniert möglicherweise nicht auf Systemen, bei denen GNU sednicht die Standardeinstellung ist.
Chris Johnsen

Stimmt, sollte aber mit den meisten Linux-

Hmm .. Ich habe gerade "sed --posix -n 1 ~ 2p filename" ausprobiert und das scheint auch zu funktionieren. Das --posix soll die Unterstützung für Gnu-Erweiterungen entfernen.

Das GNU- sedHandbuch gnu.org/software/sed/manual/html_node/Addresses.html#Addresses sagt "first ~ step This GNU extension ...". Es wird nicht erwähnt --posix. Wenn ich es versuche gsed --posix -n 1~2p(GNU sed 4.2.1), bekomme ich gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen

Ok .. macht Sinn. Weiß nicht, was mit meinem Sed los ist. Ich benutze cygwin, das könnte also etwas damit zu tun haben.


2

2 Möglichkeiten, wie Sie es mit awk machen können

$ awk '{getline;print}' file # the equivalent of the selected sed answer
$ awk 'NR%2==0' file

ODER nur mit der Muschel

i=1; while read -r line; do [ $((i++ % 2)) -eq 0 ] && echo $line; done <"file"


0

Habe dies nicht getestet (scheint nicht unter Mac OS X zu funktionieren), aber GNU sed unterstützt dies first~stepals Adressauswahl, zum Beispiel:

sed -n 1~2p file

würde in der ersten Zeile beginnen und danach jede zweite Zeile drucken.


Richtig, das ist eine GNU-Erweiterung. Mac OS X verwendet sedin der Basisinstallation ein BSD .
Chris Johnsen


-2

Sie können diese Befehle verwenden, um das Ergebnis anzufordern

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'


2
-1. Dies entspricht den Antworten von vor fast 10 Jahren, kleinere Unterschiede werden überhaupt nicht erklärt. Und warum ist ls -lhier?
Kamil Maciorowski
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.