Saya ingin membagi file teks menurut kumpulan baris yang telah ditentukan sebelumnya.
Misalnya. Saya punya file
a
b
c
d
e
f
Dan kemudian saya memiliki set baris berikut (ini dapat disimpan namun lebih nyaman, pada satu file, banyak file,…).
1,2
3,6
5,4
Saya ingin membagi file saya sehingga saya mendapatkan 3 file kembali seperti:
file1
a
b
file2
c
f
file3
e
d
Jawaban yang Diterima:
Ini adalah bash
skrip dengan asumsi file input Anda bernama infile dan rentang disimpan 1 per baris dalam file bernama splits:
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
Ini hanya menggunakan sed
untuk mencetak baris yang ditentukan oleh rentang, dan menyimpan setiap hasil sebagai file baru (file yang dibuat diberi nama file1 file2 file3 dll). Dua pemanggilan sed
digunakan untuk mempertahankan urutan baris yang ditentukan.
Perhatikan bahwa tidak ada format atau pemeriksaan kesalahan yang dilakukan oleh skrip sederhana ini, dan file yang ada bernama mis. file1 akan ditimpa.
Alternatif yang disederhanakan (milik @muru) menggunakan while read
dan membiarkan bash membagi rentang alih-alih memotong:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Jika urutan baris dalam file keluaran penting (misalnya baris 5,4 !=4,5), maka sed
bit perlu dipecah menjadi dua pemanggilan terpisah yang mirip dengan skrip pertama.