Печать в табличном формате в TCL / PERL - PullRequest
0 голосов
/ 01 июня 2019

У меня есть скрипт в tcl, в котором переменная получает набор данных в каждом цикле и добавляет в файл.Предположим, что в loop1,

$var = {xy} {ty} {po} {iu} {ii}

и в loop2

$var = {a} {b} {c} {d1} {d2} {e3}

Теперь в файле f.txt переменная в дампе.Вроде ставит $ file $ var.И в файле это выглядит так: Строка № 1: {xy} {ty} {po} {iu} {ii}

Строка № 2: {a} {b} {c} {d1} {d2}

Я хочу напечатать их, наконец, в файле в табличном формате.Как ниже:

xy  a

ty  b

po  c

iu  d1

ii  d2

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Сначала прочитайте файл и извлеките слова из первых двух строк:

set f [open "f.txt"]
set words1 [regexp -all -inline {\S+} [gets $f]]
set words2 [regexp -all -inline {\S+} [gets $f]]
close $f

Хитрость в том, что regexp -all -inline возвращает все соответствующие подстроки, а \S+ выбирает не-пробельные последовательности символов.

Затем, поскольку мы производим табличный вывод, нам нужно измерить максимальный размер элементов в первом списке.Мы могли бы также измерить второй список одновременно.

set len1 [tcl::mathfunc::max {*}[lmap w $words1 {string length $w}]]
set len2 [tcl::mathfunc::max {*}[lmap w $words2 {string length $w}]]

lmap применяет string length к каждому слову, и затем мы находим максимум из них.{*} заменяет список (длин слов) несколькими аргументами.

Теперь мы можем перебрать два списка и создать форматированный вывод:

foreach w1 $words1 w2 $words2 {
    puts [format "%-*s  %-*s" $len1 $w1 $len2 $w2]
}

Последовательность формата %-*s использует два аргумента, один из которых представляет собой длину поля, а другой - строку, которая должна быть помещена в это поле.Выравнивание по левому краю в поле и отступы справа пробелами.Без - это выровняло бы по правому краю;это более полезно для целых чисел.Вместо этого вы можете использовать символы табуляции для разделения, что обычно хорошо работает, если слова короткие, но не так хорошо, когда вы получаете более широкое сочетание длин.


Если выпытаясь создать фактический файл значений, разделенных табуляцией, пакет csv в Tcllib сгенерирует их с правильными (очевидными!) опциями.

0 голосов
/ 01 июня 2019

Попробуйте это:

$ perl -anE 'push @{$vars[$_]}, ($F[$_] =~ s/^[{]|[}]$//gr) for 0.. $#F; END {say join "\t", @$_ for @vars}' f.txt
xy  a
ty  b
po  c
iu  d1
ii  d2

переключатели командной строки:

  • -a : включить авторазделение пробела на @Fмассив.

  • -n : зацикливать строки во входном файле, задавая массиву @F слова в текущей строке.

  • -E : выполнить следующий аргумент как однострочный

Удаление окружающих скобок из каждого слова:

  • $F[$_] =~ s/^[{]|[}]$//gr
    • g: глобальное замещение (мы хотим удалить и { и })
    • r: неразрушающая операция, возвращает результатзамена вместо модификации @F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...