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


quelle

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.

Chris Johnsen
quelle
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.

Adobe
quelle
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
Andrew Dyster
quelle
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
awk '{if(NR%2!=0)print}' myfile
mouviciel
quelle
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"
user31894
quelle
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.


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

Konnte nicht getestet werden, fand einen Link: cat -n $ 1 | grep "$ ODDRE" | schneide -b 8-> oddfile. $$ aus

Francisco Aquino
quelle
Sie haben das Wichtigste verpasst ... was ODDREjetzt ansteht. Diese Antwort funktioniert jedoch nur, wenn die Datei weniger als eine Million Zeilen enthält.
Andrew McGregor
-2

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

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'

AAKANKSHA JAIN
quelle
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