Первая проблема, с которой вы столкнулись, заключается в том, что ваш последний join
ошибочен: вам нужно указать ему присоединение с символами новой строки вместо значения по умолчанию (с одним пробелом):
set x [join $l1 "\n"]
Во-вторых, когда вы создаете линию фиксированной ширины, например:
AND1_2X 0.1 1.25ff 1.50ns
Вы должны использовать команду format
, чтобы сделать это. Если вы знаете C * printf()
, вы должны найти его интуитивно понятным. В противном случае используйте что-то вроде этого:
# First, this is how to pick out the fields, assuming they're always present
set fieldData [regexp -all -inline {\S+} $line]
# Let's get some good names instead of using loads of lindex calls
lassign $fieldData name delay trans load
# Now let's transform that into the output line
lappend l1 [format "%-8s %3s %5s %6s" $name $trans $load $delay]
В частности, %3s
означает «отформатировать это поле» (начиная с $trans
в приведенном выше коде) «в строке с выравниванием по правому краю шириной в три символа», а %-8s
означает «отформатировать это поле в выровненное по левому краю поле шириной восемь символов ». Такие вещи отлично для вывода с фиксированной шириной.
Если вы имеете дело с вводом фиксированной ширины с пропущенными случайными полями, вам нужно scan
(что-то вроде инверсии format
).
Наконец, определенно особый случай строк заголовка. Это намного проще!