#awk
#awk
Вопрос:
У меня есть входной файл с данными в виде
cell input out type fun level
AI20 A1,A2,A3 Z comb ((A1A2)) 2
INV I1 ZN comb (!I1) 1
BUF A1,A2,A3,B1 Z comb (!(((A1A2)A3)B1)) 4
CLK C Z seq Cq 1
XOR A1,A2,B1 Z comb (((A1A2)B1) 3
IAD A1,A2,A3 Z comb (!((A1A2)A3)) 3
INV I1 ZN comb (!I1) 1
Я хочу вывод, как показано ниже
cell ins input out
AI20 i1 .A1(A),.A2(B),.A3(C) .Z(n1)
INV i2 .I1(n1) .ZN(n2)
BUF i3 .A1(n2),.A2(1),.A3(0),.B1(0) .Z(n3)
CLK i4 .C(n3) .Z(n4)
XOR i5 .A1(n4),.A2(0),.B1(0) .Z(n5)
IAD i6 .A1(1),.A2(n5),.A3(0) .Z(n6)
INV i7 .I1(n6) .ZN(X)
Логика
если это первая строка входного файла, то есть
AI20
назначьте его входныеA1,A2
данные определяемым пользователемA and B
и назначьте ему выходные данныеn1
. Для следующей строки во входном файле назначьтеprevious net n1
одному из входных и0/1
другим входам этой строки и назначьте его вывод следующей сетиn2
и так далее.n1, n2,n3 so on
являются сетями и могут быть назначены массиву, который не имеет. Количество строк равноno of rows in (input file)-1
(количество строк исключает строку заголовка входного файла). Если это последняя строка или строка входного файла, тогда назначьте вывод этой строки или строкиX
.i1,i2,i3...
это имя экземпляра, в котором количество строк равноno of rows of (input file)
.A, B, X определяются пользователем. Мы можем напрямую использовать их в коде. Термин внутри скобки для ввода в основном тот, который присутствует в предыдущей строке в output() . Исключение будет для ввода первой строки и вывода последней строки, условия () которых определены напрямую.
Я использовал код
awk ' { print $1 ;print "."$2"()"; print "."$3"()" file }'
Это дает мне, но как я могу построить логику для inside() .
AI20 .A1(), .A2(),.A3() .Z()
Комментарии:
1. Да .. в основном это похоже.. мы просматриваем входной файл. Если это начальная строка, то для ее ввода назначьте A,B внутри
()
, чтобы мы получилиA1(A) A2(B)
, а для ее вывода назначьте егоn1
, чтобы мы получилиZ(n1)
. Для 2-й строки в файле. Назначьте любому из его входных данных какn1
в скобках, чтобы мы получилиI1(n1)
и присвоили остальным входам значение 0,1, если оно присутствует. Для его вывода присвоите ему значение n2 в скобках, т.е.ZN(n2)
и так далее.2. Я не знаю максимальную длину ввода. Но мы можем проверить
,
, есть ли оно там, чем у нас есть входные данные, и если его там нет, это означает, что это конец. Пробел был моей проблемой смещения, я исправил вопрос.A2(n5)
находится во втором значении в строке 6, потому что мы можем назначитьn
любому входному не только начальному.0
и1
назначаются случайным образом для оставшихся входных данных. @Jonathan3. Значит, назначение
0/1
полностью случайно вinput
поле? Также присваиваетсяn1, n2, n3..
также случайным образом любому из входных данных?4. Да ..
0/1/n1,n2,n3...
назначаются случайным образом любым полям ввода. Но сначала нам нужно назначитьn1,n2..
поле ввода, и если входные данные оставлены, мы назначим0/1
левым полям ввода.5. Так что вместо
.A1(1),.A2(n5),.A3(0)
четного.A1(n5),.A2(1),.A3(0)
также будет правильный вывод? @NEHACHOUDHARY
Ответ №1:
Вы можете использовать этот awk
скрипт:
cat remap.awk
NR == 1 {
print "cell ins input out"
next
}
id != "" {
r
print id, "i" r, s, "." out "(n" r ")"
}
{
n = split($2, a, /,/)
s = ""
if (NR == 2) {
ch = 65
for (i=1; i<=n; i)
s = (s == "" ? "" : s ",") sprintf(".%s(%c)", a[i], ch )
} else {
s = "." a[1] "(n" r ")"
for (i=2; i<=n; i)
s = s "," sprintf(".%s(%d)", a[i], i%2)
}
id = $1
out = $3
}
END {
if (r)
print id, "i" r 1, s, "." out "(X)"
}
Затем используйте его как:
awk -f remap.awk file.txt | column -t
cell ins input out
AI20 i1 .A1(A),.A2(B),.A3(C) .Z(n1)
INV i2 .I1(n1) .ZN(n2)
BUF i3 .A1(n2),.A2(0),.A3(1),.B1(0) .Z(n3)
CLK i4 .C(n3) .Z(n4)
XOR i5 .A1(n4),.A2(0),.B1(1) .Z(n5)
IAD i6 .A1(n5),.A2(0),.A3(1) .Z(n6)
INV i7 .I1(n6) .ZN(X)
Комментарии:
1. Сэр, строка
s = s "," sprintf(".%s(%d)", a[i], i%2
, которой он назначит второй строке один ввод,n
а для остальных входныхi%2
данных назначит0/1
правильный.? Но когда я запускаю код,0/1
они не назначаются левым входам.2. Выходные данные в вашем ans — это то, что я ожидаю, но когда я запускаю код, я получаю другой вывод,
0/1
который не присваивается левым входам.3. Вы можете увидеть рабочую демонстрацию здесь: ideone.com/g5vH7R Это работает с вашими выборочными данными
4. Да, сэр, я проверил, это работает. Понимание кода. Спасибо