Hanya tampilkan garis-garis aneh dengan kucing


27

HAI,

mungkin ini sesuatu yang sangat mudah, tetapi saya tidak mengerti sekarang. Di Linux, shell, diberi file teks, bagaimana saya bisa melakukan sesuatu seperti, nama file kucing jadi saya hanya melihat baris pertama, baris ketiga, 5, 7, 9 dan seterusnya?

jika tidak dengan kucing, dengan perintah lain

Terima kasih

bash 

Jawaban:


40

Menggunakan awk:awk 'NR % 2 == 0' filename

Sunting: dihapus {print}, seperti yang ditunjukkan dalam jawaban ghostdog74 dan dikomentari oleh Roberto Bonvallet.


1
{print}adalah tindakan default, jadi awk 'NR % 2 == 0' < myfilesudah cukup.

3
@roberto, tidak perlu pengalihan input.
user31894

1
Sama seperti catatan, ini menunjukkan garis genap (di mana garis pertama adalah 1) dan garis ganjil (jika Anda menganggap garis pertama sebagai 0). Ganti 2 == 0dengan 2 == 1untuk yang sebaliknya.
cde

13

Atau semacamnya

sed -n 'p;n' filename

Untuk penjelasan cari halaman manual sed.


Ini adalah sedversi portabel yang menyelinap di pikiranku.
Chris Johnsen

1
Anda dapat dengan mudah melewati garis di muka dengan sed -n '1d;p;n'untuk garis genap misalnya
kisp

7

Gunakan sed:

sed -n 1~2p filename

1
Ini adalah ekstensi GNU. Ini mungkin tidak bekerja dengan sistem di mana GNU sedbukan default.
Chris Johnsen

Benar tetapi harus bekerja dengan sebagian besar rasa Linux

Hmm .. Saya baru saja mencoba "sed --posix -n 1 ~ 2p nama file" dan itu sepertinya berhasil juga. --Posix seharusnya menghapus dukungan untuk ekstensi gnu.

sedManual GNU gnu.org/software/sed/manual/html_node/Addresses.html#Addresses mengatakan "pertama ~ langkah ekstensi GNU ini ...". Tidak disebutkan --posix. Ketika saya mencoba gsed --posix -n 1~2p(GNU sed 4.2.1), saya mengerti gsed: -e expression #1, char 2: unknown command: ‘~’.
Chris Johnsen

Ok .. masuk akal. Tidak tahu apa yang salah dengan sed saya. Saya menggunakan cygwin, jadi mungkin ada hubungannya dengan itu.


2

2 cara Anda bisa melakukannya dengan awk

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

ATAU hanya dengan shell

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


0

Belum menguji ini (tampaknya tidak berfungsi pada Mac OS X), tetapi GNU dan dukungan first~stepsebagai pemilihan alamat, jadi misalnya:

sed -n 1~2p file

akan mulai pada baris pertama dan mencetak setiap baris lainnya setelah itu.


Benar, ini adalah ekstensi GNU. Mac OS X menggunakan BSD seddalam instalasi dasar.
Chris Johnsen


-2

Anda dapat menggunakan perintah ini untuk meminta hasil

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'


2
-1. Ini duplikat jawaban dari hampir 10 tahun yang lalu, perbedaan kecil tidak dijelaskan sama sekali. Dan mengapa ada di ls -lsini?
Kamil Maciorowski
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.