Apakah mungkin untuk mengurutkan antara dua string dalam file besar?
mis. File saat ini adalah sebagai:
0cf Front Brake
0d0 Rear Brake
0ce Handle Bars
HUT 03 VR Controls
009 Vest
001 Belt
002 Body Suit
020 Stereo Enable
003 Flexor
007 Hand Tracker
004 Glove
006 Head Mounted Display
008 Oculometer
00a Animatronic Device
000 Unidentified
021 Display Enable
005 Head Tracker
HUT 04 Sport Controls
000 Unidentified
002 Golf Club
001 Baseball Bat
Dan output yang diinginkan adalah:
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
Di sini, Bagian HUT 03 Kontrol VR dan Kontrol Olahraga HUT 04 diurutkan.
Dalam file yang diberikan, Header bagian dimulai dengan karakter non-spasi sementara konten bagian selalu dimulai dengan spasi atau tab. Karena file ini memiliki 100+ bagian maka tidak akan layak untuk nama bagian hard-code dalam skrip / perintah
Jawaban:
Dengan Python:
Ini mengurutkan semua bagian (secara terpisah), tidak hanya di antara dua baris tertentu.
sumber
Untuk bersenang-senang, berikut adalah cara untuk mengurutkan satu bagian menggunakan
ex
:sumber
Ini digunakan
awk
untuk menambahkan angka (dan pemisah tab) di depan setiap baris yang sesuai dengan bagian di mana baris ini berada. Untuk header bagian, kami menambahkan angka diikuti oleh karakter backspace (hanya karena backspace mengurutkan sebelum tab). Kemudian kita cukup mengurutkan data yang dihasilkan pada angka-angka ini sebelum menghapusnya dan pemisah tab yang ditambahkan.Header bagian dideteksi dengan mencari karakter yang tidak kosong di awal baris.
sumber
HUT
bidang) sebagai awalan, untuk mengurutkan bagian juga.Anda bisa mendapatkan
awk
dansort
bekerja sama untuk menyelesaikan pekerjaan.sort
close
padasort
saat bagian penanda ditemui; ini menyebabkansort
flush outputnya ke output standar dan keluarsort
pengambilalihan untuk baris konten mengikuti penanda bagianclose
padasort
di akhir untuk mengurus konten membuntutisumber
Untuk tugas-tugas seperti itu, saya sering merasa bosan untuk menulis naskah. Jika hanya perlu dilakukan sekali dan mungkin untuk beberapa file, itu bisa dilakukan dengan cukup baik menggunakan makro jika Anda membuka file
vim
dan ketik:GoFAKE SECTION<ESC>
: tambahkan bagian palsu di bagian akhir, dan pastikan ini ada di awal baris (Anda mungkin telahcindent
atauautoindent
diaktifkan). Ini diperlukan untuk menyortir bagian terakhir juga.gg
: kembali ke awal file, lalu file dimulai dengan bagian turun satu baris denganj
qq
: mulai merekam makro untuk mendaftar qv
: mulai seleksi/^\S\+<Enter>
: cari awal bagian selanjutnyak
: naik satu baris:!sort<Enter
: urutkan bagiannj
: buka elemen pertama dari bagian selanjutnyaq
: berhenti merekam makro@q
: ulangi makro100@@
: ulangi makro beberapa kali (sampai tidak ada bagian yang tersisa)dd
: hapus baris terakhir file (theFAKE SECTION
)Anda mungkin ingin
:set lazyredraw
mempercepat eksekusi makro.sumber