Pokaż tylko nieparzyste linie z cat

28

CZEŚĆ,

prawdopodobnie jest to coś bardzo łatwego, ale nie rozumiem teraz. W Linuksie powłoka, biorąc pod uwagę plik tekstowy, jak mogę zrobić coś takiego, nazwa pliku cat, więc widzę tylko pierwszy wiersz, trzeci wiersz, 5, 7, 9 i tak dalej?

jeśli nie z kotem, z innym poleceniem

Dzięki


źródło

Odpowiedzi:

42

Używanie awk:awk 'NR % 2 == 0' filename

Edycja: usunięto {print}, jak pokazano w odpowiedzi ghostdog74 i skomentował Roberto Bonvallet.

Chris Johnsen
źródło
1
{print}to akcja domyślna, więc awk 'NR % 2 == 0' < myfilewystarczy.
3
@roberto, nie potrzebujesz przekierowania wejściowego.
user31894
1
Uwaga: pokazuje linie parzyste (gdzie pierwsza linia to 1) i linie nieparzyste (jeśli myślisz o pierwszej linii jako 0). Wymień 2 == 0się 2 == 1za przeciwieństwo.
cde
13

Lub coś w tym rodzaju

sed -n 'p;n' filename

Aby uzyskać wyjaśnienie, wyszukaj stronę podręcznika użytkownika sed.

Cegła suszona na słońcu
źródło
To przenośna sedwersja, która wpadła mi w pamięć.
Chris Johnsen
1
możesz z łatwością pominąć linie z góry, sed -n '1d;p;n'na przykład dla linii parzystych
kisp
7

Użyj sed:

sed -n 1~2p filename
Andrew Dyster
źródło
1
To jest rozszerzenie GNU. Może nie działać w systemach, w których GNU sednie jest domyślny.
Chris Johnsen
To prawda, ale powinno działać z większością wersji Linuksa
Hmm .. Właśnie próbowałem „sed --posix -n 1 ~ 2p nazwa pliku” i to też wydaje się działać. --Posix ma usunąć obsługę rozszerzeń GNU.
GNU sedręczne gnu.org/software/sed/manual/html_node/Addresses.html#Addresses mówi „pierwszy krok ~ To rozszerzenie GNU ...”. Nie wspomina --posix. Kiedy próbuję gsed --posix -n 1~2p(GNU sed 4.2.1), rozumiem gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen
Ok .. ma sens. Nie wiem, co jest nie tak z moim sedem. Używam cygwina, więc to może mieć z tym coś wspólnego.
2
awk '{if(NR%2!=0)print}' myfile
mouviciel
źródło
2

Na dwa sposoby możesz to zrobić za pomocą awk

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

LUB tylko z powłoką

i=1; while read -r line; do [ $((i++ % 2)) -eq 0 ] && echo $line; done <"file"
użytkownik31894
źródło
0

Nie przetestowałem tego (wydaje się, że nie działa w systemie Mac OS X), ale GNU sed obsługuje first~stepwybór adresu, więc na przykład:

sed -n 1~2p file

zaczynałby się od pierwszego wiersza i wypisywał co drugi wiersz później.


źródło
Tak, to rozszerzenie GNU. Mac OS X używa BSD sedw instalacji podstawowej.
Chris Johnsen
-2

Możesz użyć tych poleceń, aby uzyskać wynik

awk „NR% 2 == 1”

sed -ne „1 ~ 2p”

AAKANKSHA JAIN
źródło
2
-1. To powiela odpowiedzi z prawie 10 lat temu, drobne różnice wcale nie są wyjaśnione. I dlaczego ls -ltu jest
Kamil Maciorowski