Memasukkan:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Output yang diharapkan:
1
2
3
4
Jadi, saya hanya perlu memiliki nilai 1, 5, 9, 13 file dalam file output. Bagaimana cara melakukannya?
text-processing
Velu
sumber
sumber
sed -n '1~4p'
Jawaban:
Menggunakan AWK:
Mencari tahu bagaimana ini bekerja dibiarkan sebagai latihan untuk pembaca.
sumber
NR % 4 == 1
IMO akan lebih terbaca.Menggunakan
split
(GNU coreutils):-n
menghasilkanCHUNKS
file outputdan
CHUNKS
sebagair/K/N
gunakan distribusi round robin dan hanya keluaran Kth of N ke stdout tanpa memisahkan garis / catatansumber
Dengan GNU
sed
:Dengan standar
sed
:Dengan
1
dan4
dalam$n
dan$i
variabel:sumber
Menambahkan solusi perl wajib:
sumber
Versi python, hanya untuk bersenang-senang:
sumber
enumerate(f)
harus dapat melakukan pekerjaan sambil mengkonsumsi lebih sedikit memorireadlines
(maka menghirup seluruh file ke dalam memori), Anda dapat menggunakanf.readlines()[::4]
untuk mendapatkan setiap baris keempat. Jadi bisa digunakanprint(''.join(f.readlines()[::4]))
.POSIX sed
: metode ini menggunakan sed posixly dan dapat dijalankan di mana-mana, atau setidaknya seds yang menghormati posix.Lainnya adalah pembuatan kode sed terprogram untuk tujuan skalabilitas:
Perl
: kita mengisi array A sampai ukurannya 4. Kemudian kita mencetak elemen pertamanya dan juga menghapus array.sumber
Panggil dengan
scriptname filename skip
(4 dalam kasus Anda) Ini berfungsi dengan menarikiter
garis dari atas file dan kemudian hanya mengeluarkan yang terakhir. Itu kemudian meningkatiter
olehskips
dan mengulangi selama nilaiiter
belum melebihilines
dalamfile
.sumber
Bash murni:
mapfile adalah builtin yang ditambahkan dalam Bash 4 yang membaca input standar ke dalam array, di sini dinamai
lines
, dengan satu baris per entri. The-t
pilihan strip baris akhir.Jika Anda ingin mencetak setiap baris keempat mulai dari baris 4, maka Anda dapat melakukannya dalam satu perintah menggunakan
mapfile
opsi panggilan balik-C
, yang menjalankan kode yang disediakan setiap begitu banyak baris, dengan interval yang diberikan oleh-c
. Indeks array saat ini dan baris berikutnya yang akan diberikan diberikan kepada kode sebagai argumen.Ini menggunakan
printf
builtin; kode format%.0s
menekan argumen pertama (indeks), jadi hanya baris yang dicetak.Anda dapat menggunakan perintah yang sama untuk mencetak setiap baris keempat mulai dari baris 1, 2, atau 3, tetapi Anda harus menambahkan sebelumnya 3, 2, atau 1 baris
input
sebelum memasukkannyamapfile
, yang menurut saya lebih banyak masalah daripada nilainya .Ini juga berfungsi:
Di sini,
printf
mengkonsumsi empat entri arraylines
sekaligus, hanya mencetak yang pertama dan melewatkan tiga lainnya dengan%.0s
. Saya tidak suka ini karena Anda harus mengutak-atik string format secara manual untuk interval atau titik awal yang berbeda.sumber