Cara tercepat untuk memfilter string

1

Saya sedang mengerjakan skrip yang membaca tajuk beberapa file (gambar medis), memfilter data dan kemudian membuat direktori file berdasarkan data itu. Tetapi ada jutaan gambar dan saya harus membuatnya lebih cepat dalam suatu tugas. Setelah membaca gambar, skrip membuat blok informasi yang saya perlu filter, menukar huruf beraksen dengan huruf normal, menukar ruang apa pun untuk garis bawah, dan kemudian menghapus karakter apa pun selain " AZ, AZ, 0-9, _ ) (] [- " . Saat ini saya menggunakan perintah SED dan Tr seperti yang ditunjukkan di bawah ini, Apakah ada cara yang lebih cepat untuk melakukan ini? TIA

BLOCK=$( command to read the images ) 
FILTER=$( echo $BLOCK | tr 'ÁÉÍÓÚáéíóúçÇ ^\' 'AEIOUaeioucC_:' | sed -e 's/[^A-_a-z0-9() -]//g' )
Vilefort
sumber
2
Apakah Anda memeriksa waktu eksekusi command to read the images? Saya hampir yakin bahwa ini membutuhkan waktu yang lebih lama daripada echo .. | tr ... | sed ...pipeline, jadi mengoptimalkannya tidak akan membantu (walaupun Anda hanya dapat pergi dengan trkinerja kecil di sini)
nohillside
ya, ini menghabiskan sekitar 15% dari waktu skrip. Tapi saya tidak bisa mengubahnya, jadi saya perlu meningkatkan kinerja di titik lain. Dalam skrip saya tidak menggunakan 'echo' tetapi FILTER = $ (perintah | tr '' '' | sed -e ''). Saya berpisah dalam dua bagian di sini hanya untuk lebih dimengerti.
Vilefort
Apa yang mengkonsumsi 85% lainnya?
nohillside
filter, pisahkan data dalam nama, tanggal, id, ketik, buat direktori baru dengan data ini, salin file ke direktori ini dan letakkan operasi di log
Vilefort
1
Atau gunakan skrip Perl / Python untuk mendorong proses, bukan sekelompok utilitas yang dikombinasikan dengan skrip shell
nohillside

Jawaban:

3

Ini tidak membahas bagian "cara tercepat" dari pertanyaan: lebih banyak ulasan kode

  1. pastikan untuk mengutip variabel Anda: echo "$BLOCK"
  2. "hapus sembarang karakter selain" AZ, AZ, 0-9, _) (] [- "->

    tr -dc '][:alnum:]_)( [-'
    

    di mana -dberarti "hapus" dan -cberarti "pelengkap set yang diberikan". [:alnum:]adalah kelas karakter yang cocok dengan huruf dan angka.

glenn jackman
sumber
Terima kasih, ini menjadi lebih cepat, tetapi saya harus mengubahnya sedikit. tr -dc '] [: alnum:] _) (\ n [-')
Vilefort