Linuxデータフィルタリングコマンド

Linuxデータフィルタリングコマンド

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

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

助けてください

答え1

結合コマンドでも、パイプラインの各エントリのソースファイルを指定します。

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
#   ^source                           ^again                             ^and again                                                                    ^and still again

代わりに、各コマンドに前のコマンドを読み取る必要があります。ここでは、2つのコマンドを組み合わせてawk不要なコマンドを削除しましたcat

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

私の答えに依存コメントの質問2番目の部分も同様に簡単です。これに応じて回答を更新します。

答え2

追加でtclを使用しないのはなぜですか?以下は例です。 tclで2番目の値を調整できるように、式を入れ子式に変更するだけです。

$ echo editPin -pin phy_inst/blah args  -assign {1443.0305 184.62} -options | \
    sed  '/editPin.*phy_inst/s/assign {\([0-9.]*\) \([0-9.]*\)}/assign { 0 [ expr \1 [ expr \2 + 123.3]]}/'
# returns editPin -pin phy_inst/blah args -assign { 0 [ expr 1443.0305 [ expr 184.62 + 123.3]]} -options

このように、sedは単なる文字列置換であり、シェル/awk/bc/etcで浮動小数点計算を実行しようとしません。

答え3

私はこれを考えました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 ;
 }

呼び出されます(foo_barを適切な値に置き換えます)。

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

生産する

eval editPin -pin i_dfi_row_cmd_p1_d[0]  -assign { 0 [ expr {1443.0305 184.62}+foo_bar ]} -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}+foo_bar ]} -layer M10 -pinWidth 0.038 -pinDepth 0.395 -fixOverlap false -fixedPin -snap MGRID

その中で awk は基本的に一行ずつ解析を行いますが、

  • 解析は、変数(フィールド数、参照)をawk使用してすべての「フィールド」を繰り返し実行します。NFman awk
  • 最初のフィールドにevalを追加します。
  • 文字列を削除phy_inst/し、次のフィールドを削除します(暗黙的に指定)。
  • フィールド編集-assign後の値
  • 変数値の挿入X(コマンドラインから呼び出す必要があります)(変数名の誤った選択)

未テスト

    if ( $i == "-assign" ) {
            $(i+1)="{ 0 [ expr " ($(i+1)+X) ;
            $(i+2)=($(i+2) + X) " ]}" ;
            }

適切なフィールドにX値を追加するだけです。

関連情報