Cara mengajukan pemisahan pada nomor baris [tertutup]

94

Saya ingin membagi file log sepanjang 400k dari nomor baris tertentu.

Untuk pertanyaan ini, mari jadikan ini angka acak 300k.

Apakah ada perintah linux yang memungkinkan saya melakukan ini ( di dalam skrip )?

aku tahu split memungkinkan saya membagi file menjadi bagian yang sama baik berdasarkan ukuran atau nomor baris tetapi bukan itu yang saya inginkan. Saya ingin 300k pertama dalam satu file dan 100k terakhir di file kedua.

Bantuan apa pun akan dihargai. Terima kasih!

Jika dipikir-pikir, ini akan lebih cocok untuk situs superuser atau serverfault.

denormalizer
sumber
16
Saya pikir pertanyaan ini baik-baik saja di sini. Anda memiliki tugas pemrograman yang Anda coba selesaikan dengan skrip shell; jika itu adalah satu baris yang menggunakan alat Unix yang tersedia secara luas, itu jauh lebih baik!
Jim Lewis
Saya juga berpikir sama. Tapi sekali lagi saya tidak menulis skrip shell :) oh baiklah, tetap menemukan jawaban saya. Terima kasih
denormalizer
5
Pertanyaan ini sangat bagus, tanpa diragukan lagi, ini adalah pertanyaan pemrograman dan juga tidak terlalu terlokalisasi
Peter
9
mengapa ini pertanyaan di luar topik? polisi pikir lebih gila dari sebelumnya.
Karel Bílek
6
Meskipun pertanyaan ini mungkin sedikit di luar topik, ini sangat dipilih dan merupakan hasil pertama di mesin pencari dengan kueri seperti "file split linux pada baris". Karena itu, saya sarankan untuk membuka kembali pertanyaan ini, sehingga jawaban berharga lainnya dapat ditambahkan. Atau setidaknya buat tautan ke pertanyaan paling relevan di SU.
Antoine Pinsard

Jawaban:

178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Juga, setelah dipikir-pikir, pemisahan akan berfungsi dalam kasus Anda, karena pemisahan pertama lebih besar dari yang kedua. Split menempatkan keseimbangan input ke split terakhir, jadi

split -l 300000 file_name

akan menghasilkan xaadengan 300k baris dan xabdengan 100k baris, untuk masukan dengan 400k baris.

AcademRobot
sumber
Terima kasih. menemukan pertanyaan serupa yang dijawab di superuser yaitu. gunakan tail dll Dan, ya split akan berfungsi dengan contoh saya, tetapi tidak selalu contoh saya 100K.
denormalizer
2
Jika Anda mencoba melakukan ini di Windows dan tidak ingin menggunakan Cygwin, proyek ini menyediakan semua utilitas yang diperlukan sebagai binari win32 asli - unxutils.sourceforge.net
Jonathon Hill
15
Saya akan menggunakan di tail -n +L file_name > bottom_filemana hanya L=K+1dengan tidak perlu menjalankan wcterlebih dahulu
Hashbrown
2
Saya lebih suka menggunakan sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, ini lebih mudah, dan tidak perlu menghitung jumlah baris. Juga, ini masih berfungsi jika baris ditambahkan di antara eksekusi setiap perintah.
Antoine Pinsard
Untuk beberapa file, jawaban ini meninggalkan garis, tetapi pengeditan yang disarankan oleh Hashbrown memperbaiki masalah tersebut.
scharette