Saya punya file CSV yang lumayan besar (75MB). Saya hanya mencoba untuk menghasilkan grafiknya, jadi saya benar-benar tidak memerlukan semua data.
Penulisan Ulang: Saya ingin menghapus n baris, lalu menyimpan satu baris, lalu menghapus n baris, dan seterusnya.
Jadi jika file terlihat seperti ini:
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
dan n = 2, maka hasilnya adalah:
Line 3
Line 6
Sepertinya sed
mungkin bisa melakukan ini, tapi aku belum bisa memikirkan caranya. Perintah bash akan ideal, tapi saya terbuka untuk solusi apa pun.
Jawaban:
NR
(Jumlah catatan) variabel adalah catatan jumlah baris karena perilaku default adalah baris baru untukRS
(record seperator). pola dan tindakan adalah opsional dalam format standar awk'pattern {actions}'
. ketika kita hanya memberikan bagian pola kemudianawk
menulis semua bidang$0
untuktrue
kondisi pola kita .sumber
awk 'NR == 1 || NR % 3 == 0'
awk 'NR == 1 || NR % 2 == 0' myfile.txt | wc -l
menghasilkan angka ganjil sementara file asli memiliki jumlah garis genap. Jawab @ kev bekerja paling baik dalam test case saya.sed
dapat juga melakukan ini:man sed
menjelaskan~
sebagai:sumber
1p
mencetak baris pertama,0~3p
mencetak setiap baris ketiga mulai dari baris 3 (dengan1p
demikian diperlukan untuk mencetak baris 1). Tetapi perhatikan bahwa0~3
ini bukan standar tetapi ekstensi sed GNU.sed -n '1p;0~10p' '.\in.txt' > out.txt
untuk mencetak file yang dikurangi menjadi file output.Perl juga bisa melakukan ini:
Program ini akan mencetak baris pertama dari inputnya, dan setiap baris ketiga setelahnya.
Untuk menjelaskannya sedikit,
<>
adalah operator input baris, yang beralih pada jalur input ketika digunakan dalamwhile
loop seperti ini. Variabel khusus$.
berisi jumlah baris yang dibaca sejauh ini, dan%
merupakan operator modulus.Kode ini dapat ditulis lebih kompak sebagai satu-liner, menggunakan
-n
dan-e
beralih:The
-e
beralih mengambil sepotong kode Perl untuk mengeksekusi sebagai parameter baris perintah, sedangkan-n
saklar secara implisit membungkus kode dalamwhile
lingkaran seperti yang ditunjukkan di atas.Sunting: Untuk benar-benar mendapatkan baris 1, 3, 6, 9, ... seperti pada contoh, daripada baris 1, 4, 7, 10, ... seperti yang saya duga Anda inginkan, ganti
$. % 3 == 1
dengan$. == 1 or $. % 3 == 0
.sumber
Jika Anda ingin melakukannya dengan skrip Bash, Anda dapat mencoba:
Simpan sebagai "read_lines.sh" dan jangan lupa memberi + x izin ke file bash.
sumber
./read_lines.sh > new_file.txt
.Solusi dalam bash murni, yang tidak menghasilkan proses adalah:
Baris pertama melewati 2 baris di awal file, dan
while
mencetak baris berikutnya dan melewati 2 baris lagi.Jika file Anda kecil, ini adalah cara yang sangat efisien untuk melakukan pekerjaan karena tidak memulai proses. Ketika file Anda besar,
sed
harus digunakan karena lebih efisien dalam menangani io daripadabash
.sumber
Versi Python (keduanya Python 2 dan Python 3):
ganti
[::3]
dengan parameter ukuran mulai, akhiri dan langkah untuk kontrol lebih lanjut. Misalnya,[10:36:5]
mengeluarkan garis 10,15, ..., 35.Catatan, karena
readlines()
membuat akhir baris, output dari panggilan ini mungkin berakhir dengan baris terakhir kosong, kecuali aslinya baris terakhir akan dimasukkan oleh ukuran langkah yang dipilih.Versi stream juga dimungkinkan (di sini output hanya setelah aliran selesai):
sumber