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]}

엑스는 상수 값이고 추가하고 싶습니다.엑스도착하다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

대신 각 명령이 이전 명령을 읽도록 해야 합니다. 여기서는 두 명령을 결합 awk하고 불필요한 명령을 삭제했습니다 cat.

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

내 대답에 달려있다댓글 질문두 번째 부분도 마찬가지로 쉬울 것입니다. 이에 따라 답변을 업데이트하겠습니다.

답변2

추가에 tcl을 사용하지 않는 이유는 무엇입니까? 다음은 예입니다. tcl에서 두 번째 값을 조정할 수 있도록 표현식을 중첩 표현식으로 변경하면 됩니다.

$ 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 값을 추가하기만 하면 됩니다.

관련 정보