Chỉ hiển thị các dòng lẻ với mèo


27

CHÀO,

có lẽ đây là một cái gì đó rất dễ dàng, nhưng tôi không nhận được điểm bây giờ. Trong Linux, shell, được cung cấp một tệp văn bản, làm thế nào tôi có thể làm một cái gì đó như, tên tệp mèo để tôi chỉ thấy dòng đầu tiên, dòng thứ ba, 5, 7, 9, v.v.

nếu không phải với mèo, với một lệnh khác

Cảm ơn

bash 

Câu trả lời:


40

Sử dụng awk:awk 'NR % 2 == 0' filename

Chỉnh sửa: đã xóa {print}, như thể hiện trong câu trả lời của ghostdog74 và nhận xét về Roberto Bonvallet.


1
{print}là hành động mặc định, như vậy awk 'NR % 2 == 0' < myfilelà đủ.

3
@roberto, không cần chuyển hướng đầu vào.
dùng31894

1
Cũng như một ghi chú, điều này hiển thị các dòng chẵn (trong đó dòng đầu tiên là 1) và các dòng lẻ (nếu bạn nghĩ dòng đầu tiên là 0). Thay thế 2 == 0bằng 2 == 1cho điều ngược lại.
cde

13

Hoặc một cái gì đó như

sed -n 'p;n' filename

Để giải thích tra cứu trang người đàn ông cho sed.


Đây là sedphiên bản di động đã trượt tâm trí của tôi.
Chris Johnsen

1
bạn có thể dễ dàng bỏ qua các dòng trả trước với sed -n '1d;p;n'các dòng chẵn chẳng hạn
kisp

7

Sử dụng sed:

sed -n 1~2p filename

1
Đây là một phần mở rộng GNU. Nó có thể không hoạt động các hệ thống trong đó GNU sedkhông phải là mặc định.
Chris Johnsen

Đúng nhưng nên hoạt động với hầu hết các hương vị của Linux

Hmm .. Tôi vừa thử "sed --poseix -n 1 ~ 2p filename" và điều đó dường như cũng hoạt động. --Poseix được cho là để loại bỏ hỗ trợ cho các tiện ích mở rộng gnu.

sedHướng dẫn sử dụng GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses nói trước tiên ~ bước Phần mở rộng GNU này. Nó không đề cập đến --posix. Khi tôi thử gsed --posix -n 1~2p(GNU sed 4.2.1), tôi nhận được gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen

Ok .. có ý nghĩa. Không biết có chuyện gì với sed của tôi. Tôi đang sử dụng cygwin, vì vậy điều đó có thể có liên quan.


2

2 cách bạn có thể làm với awk

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

HOẶC chỉ với vỏ

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


0

Chưa thử nghiệm điều này (dường như không hoạt động trên Mac OS X), nhưng GNU sed hỗ trợ first~stepnhư một lựa chọn địa chỉ, ví dụ:

sed -n 1~2p file

sẽ bắt đầu ở dòng đầu tiên và in mọi dòng khác sau đó.


Phải, đây là một phần mở rộng GNU. Mac OS X sử dụng BSD sedtrong cài đặt cơ sở.
Chris Johnsen


-2

Bạn có thể sử dụng các lệnh này để yêu cầu kết quả

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'


2
-1. Điều này trùng lặp câu trả lời từ gần 10 năm trước, những khác biệt nhỏ không được giải thích. Và tại sao lại ls -lở đây?
Kamil Maciorowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.