单行条件编辑行
Conditional editing of line by one-liner
我的问题更多是优化问题,而不是“操作方法”。
我有一个 lef 文件,其中有数千行,格式如下:
RECT 429.336 273.821 426.246 274.721 ;
我想使用单线将所有矩形向左移动 4 um 以上的特定点:
perl -lane '$F[2] > 1200 ? print $F[0]," ", ($F[1] - 4)," ", $F[2]," ", ($F[3] -4)," ", $F[4], " ;" : print $_' trial.lef
事实是,这是 UGLY。
有没有更好的编辑文件的方法?
我不挑剔,很乐意用其他语言(awk、sed 等)回答,只要它们比我写的更好。
附加输入:
LAYER M12 ;
RECT 0 411.214 1 412.214 ; <-- shouldn't change, because 411.214 < 1200
END
END kuku_pin
PIN gaga_pin
DIRECTION OUTPUT ;
USE SIGNAL ;
PORT
LAYER M11 ;
RECT 43.1045 1203.138 43.1805 1207.29 ; <-- should change to "RECT 39.1045 1203.138 39.1805 1207.29"
END
确实没有太大的改进空间,但是您可以将-n
替换为-p
以跳过额外的print
。此外,您可以编辑数组元素并使用 join
以获得更漂亮的代码:
perl -lape'if ($F[2] > 1200) { $F[1] -= 4; $F[3] -= 4; $_ = join " ", @F }'
-a
自动拆分模式,在 space 上拆分行 $_
并将值放入预定义的 @F
数组中。此开关与 -n
或 -p
一起使用。
-p
循环 <>
操作员输入、文件或标准输入
-=
将 LHS 减少 RHS 的数量
join
在完成数学运算后将线重新连接在一起
-l
在这种情况下可以跳过,因为我们从不触及行尾,但如果我们决定编辑最后一个字段,保留它会使代码更加灵活。
不满足条件时,原行打印不变。否则,它将替换为 @F
.
中的连接值
如果您决定在 RECT
之前保留领先的白色 space,您可以用
包围您的 if 语句
if (($pre) = /^(\s*RECT)/)
存储行首,制作一行:
perl -lape'if (($pre) = /^(\s*RECT)/) { if ($F[2] > 1200) { $F[1] -= 4; $F[3] -= 4; $F[0] = $pre; $_ = join " ", @F }}'
我的问题更多是优化问题,而不是“操作方法”。
我有一个 lef 文件,其中有数千行,格式如下:
RECT 429.336 273.821 426.246 274.721 ;
我想使用单线将所有矩形向左移动 4 um 以上的特定点:
perl -lane '$F[2] > 1200 ? print $F[0]," ", ($F[1] - 4)," ", $F[2]," ", ($F[3] -4)," ", $F[4], " ;" : print $_' trial.lef
事实是,这是 UGLY。
有没有更好的编辑文件的方法?
我不挑剔,很乐意用其他语言(awk、sed 等)回答,只要它们比我写的更好。
附加输入:
LAYER M12 ;
RECT 0 411.214 1 412.214 ; <-- shouldn't change, because 411.214 < 1200
END
END kuku_pin
PIN gaga_pin
DIRECTION OUTPUT ;
USE SIGNAL ;
PORT
LAYER M11 ;
RECT 43.1045 1203.138 43.1805 1207.29 ; <-- should change to "RECT 39.1045 1203.138 39.1805 1207.29"
END
确实没有太大的改进空间,但是您可以将-n
替换为-p
以跳过额外的print
。此外,您可以编辑数组元素并使用 join
以获得更漂亮的代码:
perl -lape'if ($F[2] > 1200) { $F[1] -= 4; $F[3] -= 4; $_ = join " ", @F }'
-a
自动拆分模式,在 space 上拆分行$_
并将值放入预定义的@F
数组中。此开关与-n
或-p
一起使用。-p
循环<>
操作员输入、文件或标准输入-=
将 LHS 减少 RHS 的数量join
在完成数学运算后将线重新连接在一起-l
在这种情况下可以跳过,因为我们从不触及行尾,但如果我们决定编辑最后一个字段,保留它会使代码更加灵活。
不满足条件时,原行打印不变。否则,它将替换为 @F
.
如果您决定在 RECT
之前保留领先的白色 space,您可以用
if (($pre) = /^(\s*RECT)/)
存储行首,制作一行:
perl -lape'if (($pre) = /^(\s*RECT)/) { if ($F[2] > 1200) { $F[1] -= 4; $F[3] -= 4; $F[0] = $pre; $_ = join " ", @F }}'