Ссылаться на поле и присваивать некоторую логику этому полю

#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 назначаются случайным образом для оставшихся входных данных. @Jonathan

3. Значит, назначение 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. Да, сэр, я проверил, это работает. Понимание кода. Спасибо