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


sumber

Jawaban:

40

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

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

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

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


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

Tidak dapat menguji, menemukan tautan: cat -n $ 1 | grep "$ ODDRE" | cut -b 8-> oddfile. $$

Francisco Aquino
sumber
Anda melewatkan hal terpenting ... apa ODDREyang diatur. Tetapi jawaban itu hanya akan berfungsi jika file tersebut kurang dari sejuta baris.
Andrew McGregor
-2

Anda dapat menggunakan perintah ini untuk meminta hasil

awk 'NR% 2 == 1'

sed -ne '1 ~ 2p'

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