GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memotong file per baris?

sed pendekatan baik-baik saja, tetapi untuk mengulang semua baris tidak. Jika Anda tahu berapa banyak baris yang ingin Anda pertahankan (sebagai contoh, saya menggunakan 99 di sini), Anda dapat melakukannya seperti ini:

sed -i '100,$ d' myfile.txt

Penjelasan:sed adalah prosesor ekspresi reguler. Dengan opsi -i diberikan, itu memproses file secara langsung ("inline") - bukan hanya membaca dan menulis hasilnya ke output standar. 100,$ hanya berarti "dari baris 100 ke akhir file" -- dan diikuti dengan perintah d , yang mungkin Anda duga dengan benar adalah singkatan dari "delete". Jadi singkatnya, perintahnya berarti:"Hapus semua baris dari baris 100 hingga akhir file dari myfile.txt". 100 adalah baris pertama yang akan dihapus, karena Anda ingin menyimpan 99 baris.

Edit: Sebaliknya, jika ada file log yang ingin Anda simpan, mis. terakhir 100 baris:

[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt

Apa yang terjadi di sini:

  • [ $(wc -l myfile.txt) -gt 100 ] :lakukan hal berikut hanya jika file memiliki lebih dari 100 baris
  • $((100 - $(wc -l myfile.txt|awk '{print $1}'))) :menghitung jumlah baris yang akan dihapus (yaitu semua baris file kecuali 100 (terakhir) yang akan disimpan)
  • 1, $((..)) d :hapus semua baris dari baris pertama hingga baris yang dihitung

EDIT: karena pertanyaannya baru saja diedit untuk memberikan detail lebih lanjut, saya juga akan menyertakan informasi tambahan ini dengan jawaban saya. Fakta tambahan adalah:

  • ukuran tertentu akan tetap bersama file (10.000 byte)
  • setiap baris memiliki ukuran tertentu dalam byte (300 byte dalam contoh)

Dari data ini dimungkinkan untuk menghitung jumlah baris yang tersisa sebagai " / ", yang dengan contoh berarti 33 baris. Istilah shell untuk perhitungan:$((size_to_remain / linesize)) (setidaknya di Linux menggunakan Bash, hasilnya adalah bilangan bulat). Perintah yang disesuaikan sekarang akan berbunyi:

# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt

Karena ukuran sudah diketahui sebelumnya, tidak perlu lagi perhitungan yang disematkan ke sed memerintah. Tetapi untuk fleksibilitas, di dalam beberapa skrip shell seseorang dapat menggunakan variabel.

Untuk pemrosesan bersyarat berdasarkan ukuran file, seseorang dapat menggunakan "test"-construct berikut:

[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&

yang artinya:"jika ukuran $file melebihi 100kB, lakukan..." (ls -lk mencantumkan ukuran file dalam kB pada posisi 5, maka awk digunakan untuk mengekstrak persis ini).


Linux
  1. Bagaimana Cara Menghapus Garis Duplikat Di Dalam File Teks?

  2. Hitung Baris Dalam File?

  3. Cara grep \n dalam file

  1. Bagaimana cara memotong file ke ukuran tertentu di Linux?

  2. Bagaimana cara menampilkan baris tertentu dari file teks di Linux?

  3. Bagaimana cara mendapatkan baris yang berisi string dalam file?

  1. Bagaimana Melewati Garis File?

  2. Bagaimana Cara Menambahkan Beberapa Baris Ke File?

  3. Cara Menghapus Semua Baris File di Vim