awkファイル管理コマンド

awkファイル管理コマンド

複数行のデータを含むファイルがあります。

editPin -pin phy_inst/i_dfi_row_cmd_p1_d[0] ctrl_soft_phy_inst/hbm_ch_tile_4_hbm_tile_inst/o_phy_row_cmd_p1[0] -assign {1443.0305 184.62} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID
editPin -pin phy_inst/i_dfi_row_cmd_p1_d[1] ctrl_soft_phy_inst/hbm_ch_tile_4_hbm_tile_inst/o_phy_row_cmd_p1[0] -assign {1444.0305 185.62} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID

いくつかのことをしたいと思い、次のように行を設定したいと思います。

eval editPin -pin i_dfi_row_cmd_p1_d[0]  -assign { 0 [ expr 1443.0305 184.62]} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID
eval editPin -pin i_dfi_row_cmd_p1_d[1]  -assign { 0 [ expr 1444.0305 185.62]} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID

私はこれらのコマンドを個別に試してみましたが、私が望む構造で動作しました。

awk '{$4=""; print $0}' all_pin 
awk '{print "eval " $0}' all_pin 
sed -e /^editPin/'{ s#phy_inst/## ; s/{/{ 0 [ expr / ; s/}/]}/ ; }' all_pin

ただし、このコマンドを一緒に使用すると、目的の結果は得られません。

cat all_pin | awk '{$4=""; print $0}' all_pin | awk '{print "eval " $0}' all_pin | sed -e /^editPin/'{ s#phy_inst/## ; s/{/{ 0 [ expr / ; s/}/]}/ ; }' all_pin

この問題に対する解決策がわかりますか?

このブロックに追加のタスクを実行したいと思います。

-assign { 0 [ expr 1443.0305 362.764+X]}

Xは定数値であり、追加したいと思います。X到着362.764 コマンドを使用します。試してみましたが、間違った答えを受けました。

awk '{print $10+100}' all_pin

助けてください

私が持っている解決策は

awk -v X=10000 -f SE.awk all_pin

###  SE.awk ###
 {  for(i=1; i<=NF ; i++ ) {
        if ( $i ~ /^phy_inst/ ) {
                $i=substr($i,10) ;
                $(i+1)="" ; }
        if ( $i == "-assign" ) {
                $(i+1)="{ 0 [ expr " $(i+1) ;
                $(i+2)=$(i+2) + X " ]}" ;
                }
 }
        $1 = "eval " $1 ;
         print ;
 }

しかし、複数のawkおよびsedコマンドを使用して別々のコマンドを作成しようとしています。最も適切なコマンドを削除するように指示してください。phy_inst/* 行で算術演算を実行する - 割り当て { 0 [式 1444.0305 185.62]}ワイヤー

削除するphy_inst/*私はこのコマンドを試しました

awk -F 'editPin/ ' '{print substr($3,10) $0}' all_pin

算術演算を実行します。わからないのでご案内ください。

ベストアンサー1

これは無限のパイプラインが機能する方法ではありません。ファイルを変更せずに常に元のファイルを処理し、結果が削除されます。

上記の構造では、入力が常に同じであることを考慮して、次のことをawk一度に試してください。

awk -v X=10000 '
        {$7 += X
         $7 =  $7 "]}"
         $6 =  "{ 0 [ expr " substr($6,2)
         $4 =  ""
         sub(/phy_inst\//,"")
         print "eval " $0
        }
' CONVFMT="%8.2f" file
eval editPin -pin i_dfi_row_cmd_p1_d[0]  -assign { 0 [ expr 1443.0305 10184.62]} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID
eval editPin -pin i_dfi_row_cmd_p1_d[1]  -assign { 0 [ expr 1444.0305 10185.62]} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID

必要に応じて個々のフィールドで機能し、X7番目のフィールドに値を追加し、を追加して"]}"から始まる結果を印刷します"eval"

おすすめ記事