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

bash 

Odpowiedzi:


42

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

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


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.


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

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

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"


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.


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”


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.