交换特定块中的列

时间:2015-12-31 18:18:42

标签: awk swap

我希望你们所有人都有一个美好的新年!

我正在尝试在文件的特定块中交换2列。文件格式为:

Startpoint: in11 (input port)
Endpoint: out421 (output port)
Path Group: (none)
Path Type: max

Point                                    Incr       Path
---------------------------------------------------------------
input external delay                     0.00       0.00 r
in11 (in)                                0.00       0.00 r
Ckt432/A[7] (TopLevel432b)               0.00       0.00 r
Ckt432/M1/A[7] (PriorityA)               0.00       0.00 r
Ckt432/M1/U7/Y (INVX1_RVT)               0.03       0.03 f
Ckt432/M5/U12/Y (OA21X1_RVT)             0.10       2.44 r
Ckt432/M5/Chan[3] (DecodeChan)           0.00       2.44 r
Ckt432/Chan[3] (TopLevel432b)            0.00       2.44 r
out421 (out)                             0.00       2.44 r
data arrival time                                   2.44
---------------------------------------------------------------
(Path is unconstrained)

Startpoint: in37 (input port)
Endpoint: out421 (output port)
Path Group: (none)
Path Type: max

Point                                    Incr       Path
---------------------------------------------------------------
input external delay                     0.00       0.00 r
in37 (in)                                0.00       0.00 r
Ckt432/A[5] (TopLevel432b)               0.00       0.00 r
Ckt432/M1/A[5] (PriorityA)               0.00       0.00 r
Ckt432/M1/U8/Y (INVX1_RVT)               0.03       0.03 f
Ckt432/M1/U13/Y (NAND2X0_RVT)            0.06       0.10 r
Ckt432/M5/U12/Y (OA21X1_RVT)             0.10       2.44 r
Ckt432/M5/Chan[3] (DecodeChan)           0.00       2.44 r
Ckt432/Chan[3] (TopLevel432b)            0.00       2.44 r
out421 (out)                             0.00       2.44 r
data arrival time                                   2.44
---------------------------------------------------------------
(Path is unconstrained)

我正在尝试

  1. 将第5列替换为第2列。如果第5列中的字母为r,则会将其替换为v。如果第5列中的字母为f,则会将其替换为^

  2. 在第1列中插入两个双引号。

  3. ;

  4. 替换第3列
  5. //

  6. 替换第4列

    这应该只在定义起始行和结束行的块中完成 - input external delaydata arrival time

    此外,我想用预定义的文本在块之前/之后更改文本。

    我的预期输出应为:

    $path {
      // from: in11
      // to: out432
      $name "test_1" ;
      $cycle 1 ;
      $slack -0.130978 ;
      $transition {
     "in11"  v  ; //  (in)
     "Ckt432/A[7]"  v  ; //  (TopLevel432b)
     "Ckt432/M1/A[7]"  v  ; //  (PriorityA)
     "Ckt432/M1/U7/Y"  ^  ; //  (INVX1_RVT)
     "Ckt432/M5/U12/Y"  v  ; //  (OA21X1_RVT)
     "Ckt432/M5/Chan[3]"  v  ; //  (DecodeChan)
     "Ckt432/Chan[3]"  v  ; //  (TopLevel432b)
     "out421"  v  ; //  (out)
      }
    }
    
    $path {
      // from: in11
      // to: out432
      $name "test_2" ;
      $cycle 1 ;
      $slack -0.130978 ;
      $transition {
      "in37"  v  ; //  (in)
      "Ckt432/A[5]"  v  ; //  (TopLevel432b)
      "Ckt432/M1/A[5]"  v  ; //  (PriorityA)
      "Ckt432/M1/U8/Y"  ^  ; //  (INVX1_RVT)
      "Ckt432/M1/U13/Y"  v  ; //  (NAND2X0_RVT)
      "Ckt432/M5/U12/Y"  v  ; //  (OA21X1_RVT)
      "Ckt432/M5/Chan[3] "  v  ; //  (DecodeChan)
      "Ckt432/Chan[3] "  v  ; //  (TopLevel432b)
      "out421"  v  ; //  (out)
      }
    }
    

    目前,我可以交换列,但我不知道如何仅在块中使用它们。我的代码是:

    awk ' { c1 = $1; c2 = $2; $1 = " \" "; $2 = c1; $3 = " \" "; $4 = $5; $5 = " ; // "; $6 = c2; print; } ' file1.txt
    

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

awk救援!

让我们一步一步地实现它,首先提取感兴趣的数据

$ awk '/data arrival time/{f=0} f; /input external delay/{f=1}' file

  in11 (in)                                0.00       0.00 r
  Ckt432/A[7] (TopLevel432b)               0.00       0.00 r
  Ckt432/M1/A[7] (PriorityA)               0.00       0.00 r
  Ckt432/M1/U7/Y (INVX1_RVT)               0.03       0.03 f
  Ckt432/M5/U12/Y (OA21X1_RVT)             0.10       2.44 r
  Ckt432/M5/Chan[3] (DecodeChan)           0.00       2.44 r
  Ckt432/Chan[3] (TopLevel432b)            0.00       2.44 r
  out421 (out)                             0.00       2.44 r
  in37 (in)                                0.00       0.00 r
  Ckt432/A[5] (TopLevel432b)               0.00       0.00 r
  Ckt432/M1/A[5] (PriorityA)               0.00       0.00 r
  Ckt432/M1/U8/Y (INVX1_RVT)               0.03       0.03 f
  Ckt432/M1/U13/Y (NAND2X0_RVT)            0.06       0.10 r
  Ckt432/M5/U12/Y (OA21X1_RVT)             0.10       2.44 r
  Ckt432/M5/Chan[3] (DecodeChan)           0.00       2.44 r
  Ckt432/Chan[3] (TopLevel432b)            0.00       2.44 r
  out421 (out)                             0.00       2.44 r

添加列替换,单独的部分等。

$ awk '/data arrival time/{f=0;print""}
             f{sub("r","v",$5);
               sub("f","^",$5);
               print $1,$5 " ; // " $2 }
    /input external delay/{f=1}' file

in11 v ; // (in)
Ckt432/A[7] v ; // (TopLevel432b)
Ckt432/M1/A[7] v ; // (PriorityA)
Ckt432/M1/U7/Y ^ ; // (INVX1_RVT)
Ckt432/M5/U12/Y v ; // (OA21X1_RVT)
Ckt432/M5/Chan[3] v ; // (DecodeChan)
Ckt432/Chan[3] v ; // (TopLevel432b)
out421 v ; // (out)

in37 v ; // (in)
Ckt432/A[5] v ; // (TopLevel432b)
Ckt432/M1/A[5] v ; // (PriorityA)
Ckt432/M1/U8/Y ^ ; // (INVX1_RVT)
Ckt432/M1/U13/Y v ; // (NAND2X0_RVT)
Ckt432/M5/U12/Y v ; // (OA21X1_RVT)
Ckt432/M5/Chan[3] v ; // (DecodeChan)
Ckt432/Chan[3] v ; // (TopLevel432b)
out421 v ; // (out)

现在,捕获输入,输出并在第一个字段中添加引号

$ awk -v q="\"" '/Startpoint:/{input=$2}
                   /Endpoint:/{output=$2}
           /data arrival time/{f=0;print""}
                             f{sub("r","v",$5);
                               sub("f","^",$5);
                               print q $1 q, $5 " ; // " $2 }
        /input external delay/{f=1; print input; print output}' file

in11
out421
"in11" v ; // (in)
"Ckt432/A[7]" v ; // (TopLevel432b)
"Ckt432/M1/A[7]" v ; // (PriorityA)
"Ckt432/M1/U7/Y" ^ ; // (INVX1_RVT)
"Ckt432/M5/U12/Y" v ; // (OA21X1_RVT)
"Ckt432/M5/Chan[3]" v ; // (DecodeChan)
"Ckt432/Chan[3]" v ; // (TopLevel432b)
"out421" v ; // (out)

in37
out421
"in37" v ; // (in)
"Ckt432/A[5]" v ; // (TopLevel432b)
"Ckt432/M1/A[5]" v ; // (PriorityA)
"Ckt432/M1/U8/Y" ^ ; // (INVX1_RVT)
"Ckt432/M1/U13/Y" v ; // (NAND2X0_RVT)
"Ckt432/M5/U12/Y" v ; // (OA21X1_RVT)
"Ckt432/M5/Chan[3]" v ; // (DecodeChan)
"Ckt432/Chan[3]" v ; // (TopLevel432b)
"out421" v ; // (out)
等等。我想你可以根据模板添加数据周围的静态值......