Как исправить выполнение awk в Tcl? - PullRequest
1 голос
/ 31 марта 2019

Я не могу прочитать поля из команды awk в Tcl, пока она выполняется в терминале, но не в скрипте Tcl.

Попытка внести изменения в синтаксис, она работает в терминале, а не в скрипте

set a { A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }

#store only cell var in file
exec grep -in "cell (?*" ./slow.lib | cut -d "(" -f2 | cut -d ")" -f1 > cells.txt

#take alphabets to loop
foreach  b $a {
puts "$b\n"

if { [ exec cat cells.txt | awk ' $1 ~ /^$b/ ' ] } {

    foreach cell [exec cat ./cells.txt] {
    puts "$b \t $cell"
    }

}

Условие должно проверить наличие первого символа в файле и дать логическое значение.Ошибка:

не может прочитать "1": такой переменной нет при выполнении "exec cat cell.txt | awk '$ 1 ~ / ^ $ b /'"

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Ваша проблема в том, что Tcl придает никакой особый смысл символу '.Он использует {} (который лучше гнездится) для той же цели.Ваша команда:

exec cat cells.txt | awk ' $1 ~ /^$b/ '

должна стать:

exec cat cells.txt | awk { $1 ~ /^$b/ }

Кроме ... вы также хотите, чтобы в ней была подставлена ​​$b (но не $1),Самый простой способ сделать это с помощью format:

exec cat cells.txt | awk [format { $1 ~ /^%s/ } $b]

Было бы более оптимальным опустить использование cat здесь:

exec awk [format { $1 ~ /^%s/ } $b] <cells.txt

Вы находитесьПомните, что весь ваш скрипт может быть написан на чистом Tcl без использования exec?

0 голосов
/ 31 марта 2019

не может прочитать "1": такой переменной нет

Сообщение об ошибке (Tcl) очень информативно.Tcl чувствует ответственность за подстановку значения переменной Tcl 1 вместо $1 (предназначено для awk как часть сценария awk).Это из-за неправильного цитирования вашего awk-скрипта.В то же время вы хотите заменить $b из Tcl.

Преврати awk 'print $1 ~ /^$b/' в awk [string map [list @b@ $b] {{$1 ~ /^@b@/}}].Фигурные скобки исключают замену Tcl на $1, @b@ уже будут заменены до того, как awk увидит это благодаря [string map].

exec cat cells.txt | awk [string map [list @b@ $b] {{$1 ~ /^@b@/}}]

То, что написано, я не понимаю, почему вы собираетесьвперед и назад между grep, awk и т. д. и Tcl.Все это можно сделать только в Tcl.

...