Tcl - замена / совпадение / уникальность - PullRequest
0 голосов
/ 18 июня 2020

Ввод:

set game1 base_ball_10_100_a_b_c
set game2 base_ball_20_200_d_e_f
set game3 base_bat_40_400_j_k_l
set game4 base_bat_50_500_m_n_o
set game5 tennis_ball_10_100_a_b_c
set game6 tennis_ball_20 200_d_e_f
set game7 tennis_bat_40_400_j_k_l
set game8 tennis_bat_50_500_m_n_o

Вывод должен быть унифицирован и распечатан, как показано ниже.

set game1 bb1_digit1
set game2 bb1_digit2
set game3 bb1_digit3
set game4 bb2_digit4
set game1 bb3_digit1
set game2 bb3_digit2
set game4 bb4_digit3
set game5 bb4_digit4

Как заменить base_ball -> bb*?

Как заменить 10_100_a_b_c -> digit*?

Какие tcl для выполнения этой задачи?

1 Ответ

3 голосов
/ 18 июня 2020

Вот это нарочитое go:

#!/usr/bin/tclsh

set input {
set game1 base_ball_10_100_a_b_c
set game2 base_ball_20_200_d_e_f
set game3 base_bat_40_400_j_k_l
set game4 base_bat_50_500_m_n_o
set game5 tennis_ball_10_100_a_b_c
set game6 tennis_ball_20_200_d_e_f
set game7 tennis_bat_40_400_j_k_l
set game8 tennis_bat_50_500_m_n_o
}

set bbs [list]
set digits [list]
foreach { k1 k2 k3 } $input {
    if { ![regexp {^([^0-9]+)(.*)$} $k3 - bb digit] } {
        error "invalid input $k3"
    }

    set bb_index [lsearch -exact $bbs $bb]
    if { $bb_index < 0 } {
        lappend bbs $bb
        set bb_index [lsearch -exact $bbs $bb]
    }

    set digit_index [lsearch -exact $digits $digit]
    if { $digit_index < 0 } {
        lappend digits $digit
        set digit_index [lsearch -exact $digits $digit]
    }

    puts "$k1 $k2 bb[expr {${bb_index}+1}]_digit[expr {${digit_index}+1}]"
}

... и вывод терминала:

set game1 bb1_digit1
set game2 bb1_digit2
set game3 bb2_digit3
set game4 bb2_digit4
set game5 bb3_digit1
set game6 bb3_digit2
set game7 bb4_digit3
set game8 bb4_digit4

Вывод немного отличается от того, что в вашем вопросе, но я предполагаю, что это то, что вы имели в виду.


Если ввод должен поступать из файла, вы можете заменить

set input {
set game1 base_ball_10_100_a_b_c
set game2 base_ball_20_200_d_e_f
set game3 base_bat_40_400_j_k_l
set game4 base_bat_50_500_m_n_o
set game5 tennis_ball_10_100_a_b_c
set game6 tennis_ball_20_200_d_e_f
set game7 tennis_bat_40_400_j_k_l
set game8 tennis_bat_50_500_m_n_o
}

на

set fd [open "name_of_file"]
set input [read $fd]
close $fd
...