Bagaimana cara mengurutkan file dengan garis string dengan jumlah simbol tertentu di baris?


2

Katakanlah saya memiliki file plaintext besar dengan string di setiap baris. String hanya terdiri dari karakter alfabet, kecuali untuk garis bawah _, yang membagi string dalam suku kata.

Saya ingin mengurutkan file teks dengan jumlah garis bawah dalam string. Poin bonus untuk menempatkan setiap kelompok X menggarisbawahi dalam file mereka sendiri.

Contoh:

hel_lo
hi
su_per_u_ser
o_ver_flow

akan memilah:

hi
hel_lo
o_ver_flow
su_per_u_ser

Saya sudah mencoba melakukan ini dengan regex, tetapi saya belum menemukan cara yang tepat untuk menghitung garis bawah (regex membingungkan saya secara menyeluruh).

Adakah yang tahu bagaimana saya bisa menangani ini?

Jawaban:


3

Python membuat ini mudah ...

open('out.txt', 'w').write('\n'.join(sorted(open('in.txt'), key=lambda x: x.count('_'))))

Bekerja seperti pesona! Menghapus \ n untuk menghilangkan baris kosong yang berlebihan. Dan harus mencari cara untuk menjalankan skrip Python juga. Terima kasih!
SpacyRicochet

4

Kode sederhana dalam awk:

#!/usr/bin/awk -f

BEGIN   { FS = "_" }        # field separator = syllable separator
        {                   # for each input line
            if(NF > 0)      # if number of syllables > 0
                print $0 > "syllable-"NF".txt"  # print the line to a file
        }

Masukkan skrip ke dalam file lalu chmod a+x berkas. Masukan bisa berasal stdin atau dari file yang ditentukan sebagai parameter ke skrip.

Output akan diurutkan dalam file bernama syllable-x.txt dimana x adalah jumlah suku kata.


1

Lebih sederhana: bash one-liner:

 cat testfile | while read line; do echo $line >> srt$(echo $line | fgrep -o _ | wc -l).txt ; done 

Output akan muncul dalam file yang disebut srtN.txt, di mana N adalah jumlah kemunculan karakter garis bawah pada baris tersebut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.