カスタムデータ型とパターンマッチング

カスタムデータ型とパターンマッチング

パターンマッチングを使用してカスタムデータをフォーマットしようとしています。予想される形式を取得できませんでした。シェルスクリプトについてはよくわかりませんが、SEのさまざまなソースで参照されている内容に基づいてスクリプトを作成できました。

助けが必要です。アドバイスをお願いします。

入力データ:

WWWW PPPA TTTT
XX XY
XA XB
XB XC
XY XE
HHHH PPPA 400 XXX6
WWWW PPPB TTTT
XB XC
XY XE
HHHH PPPB 200 XXX1
WWWW PPPC TTTT
XX XY
XA XB
XB XC
HHHH PPPC 300 XXX9
WWWW PPPA TTTT
XA XB
XB XC
XN XX
HHHH PPPA 300 XXX6
WWWW PPPD TTTT
XX XY
XA XB
XB XC
XY XE
XN XA
HHHH PPPD 500 XXX4

予想出力:

WWWW PPPB TTTT 
XX XC
XY XE
HHHH PPPB 200 XXX1
WWWW PPPC TTTT
XX XY
XA XB
XB XC  
HHHH PPPC 300 XXX9
WWWW PPPA TTTT
XA XB
XB XC
XN XX
XX XY
XA XB
XB XC
XY XE
HHHH PPPA 700 XXX6
WWWW PPPD TTTT
XX XY
XA XB
XB XC
XY XE
XN XA
HHHH PPPD 500 XXX4

ここのコメントをご覧ください。これも他のコードを参照して書かれています。私はここの論理を直接理解しようとしています。私はシェルに関する非常に基本的な知識を持っており、もっと学び、理解したいと思います。

pattern='PPPA'

awk -v ptn="${pattern}" '                            # pass pattern in as awk variable "ptn"
$0 ~ "^WWWW "ptn"$" { save=1 ; next }                # start of group => set save flag; skip to next line
$0 ~ "^HHHH "ptn" " { save=0 ; next }                # end of group => clear save flag; skip to next line
save                { ++i ; line[i]=$0 ; next }      # if save=1 then store current line in next position of array line[]; skip to next line
                    { print }                        # otherwise print all other lines to stdout

END { if ( i >= 1 )                                  # if we found any matches ...
         { printf "%-561s%s", "WWWW", ptn            # print the new "WWWW" line
           for ( j=1 ; j<=i ; j++ )                  # then loop through our list of indices ...
               { print line[j] }                     # printing the associated line[] element
           fmt="HHHH %s %02i\n"                      
           printf "%-69s%-491s%02i" "HHHH", i, ptn   # print the "HHHH" line
         }
     }
' TESTX1.txt

ここで達成することは、2つのデータセットを一致するパターンに結合することです。まずパターンを検索してから、一致したらパターンをもう一度検索してくださいWWWWPPPAその後、この特定のデータブロックの開始レコードと終了レコードがマージされます。

WWWW入力データセットには、パターンがある2つのグループがあることがわかりますPPPA。最終レコードのデータ数を調整しながら、これを1つのデータグループにマージしたいと思います。

  HHHH PPPA 400 XXX6 
+ HHHH PPPA 300 XXX6 
= HHHH PPPA 700 XXX6  (400 + 300 = 700)

WWWW PPPA TTTT両方のデータグループについて同じであるため、変更されません。

スクリプト出力が予想と異なります。

WWWW PPPA TTTT
XX XY
XA XB
XB XC
XY XE
WWWW PPPB TTTT
XB XC
XY XE
HHHH PPPB 200 XXX1
WWWW PPPC TTTT
XX XY
XA XB
XB XC
HHHH PPPC 300 XXX9
WWWW PPPA TTTT
XA XB
XB XC
XN XX
WWWW PPPD TTTT
XX XY
XA XB
XB XC
XY XE
XN XA
HHHH PPPD 500 XXX4

解決策を提示し、データが操作されていない実際のデータをアップロードしていただきありがとうございます。ロジックは同じままですが、フォーマットが異なります。

実データ入力

WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPA                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XX XY
XA XB
XB XC
XY XE
HHH                                                                  500                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPA                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPB                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XB XC
XY XE
HHH                                                                 3500                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPB                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPA                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XA XB
XB XC
XN XX
HHH                                                                 1000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPA                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPC                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                         XXXAABB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
XX XY
XA XB
XB XC
XY XE
XN XA
HHH                                                                 4000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPC                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

実際のデータ予想出力#

WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPB                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XB XC
XY XE
HHH                                                                 3500                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPB                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPA                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XX XY
XA XB
XB XC
XY XE
XA XB
XB XC
XN XX
HHH                                                                 1500                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPA                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPC                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                         XXXAABB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
XX XY
XA XB
XB XC
XY XE
XN XA
HHH                                                                 4000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPC                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

ベストアンサー1

開始パターンの行末を一致させようとします$が、入力の対応する位置に行末がありません。ENDヘッダー/フッターブロック形式も破損しています。

コードを少し修正してください。

pattern='PPPA'
awk -v ptn="$pattern" '
  $0 ~ "^WWWW " ptn " "{ save=1; header=$0; next }
  save && $0 ~ "^HHHH " ptn " "{ save=0; footer=$0; sum+=$3; next }
  save{ line[i++]=$0; next }
  1  # print current record
  
  END{
    if (i){
      print header
      for (j=0;j<i;j++) print line[j]
      $0=footer  # assign footer to current record
      $3=sum     # replace 3rd field with sum
      print      # print footer
    }
  }
' file

出力:

WWWW PPPB TTTT
XB XC
XY XE
HHHH PPPB 200 XXX1
WWWW PPPC TTTT
XX XY
XA XB
XB XC
HHHH PPPC 300 XXX9
WWWW PPPD TTTT
XX XY
XA XB
XB XC
XY XE
XN XA
HHHH PPPD 500 XXX4
WWWW PPPA TTTT
XA XB
XB XC
XY XE
XA XB
XB XC
XN XX
HHHH PPPA 700 XXX6

変更された実際のデータコードは次のとおりです。

  • WWW最初のフィールドで一致HHH、2番目(ヘッダー)、または3番目(底)フィールドでパターンを一致
  • ブロックの値を変更するoldvalueために使用する前のフッター値を保存します。sumEND
  • 2番目のフィールドをフッター値として使用(sum、、oldvalue
pattern='PPPA'
awk -v ptn="$pattern" '
  $1=="WWW" && $2==ptn{ save=1; header=$0; next }
  save && $1=="HHH" && $3==ptn{ save=0; oldvalue=$2; sum+=$2; footer=$0; next }
  save{ line[i++]=$0; next }
  1
  
  END{
    if (i){
      print header
      for (j=0;j<i;j++) print line[j]
      sub(oldvalue, sum, footer) # replace oldvalue with sum
      print footer
    }
  }
' file

出力:

WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPB                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XB XC
XY XE
HHH                                                                 3500                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPB                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPC                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                         XXXAABB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
XX XY
XA XB
XB XC
XY XE
XN XA
HHH                                                                 4000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPC                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
WWW                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PPPA                                                  TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                            XXXAAXX                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
XX XY
XA XB
XB XC
XY XE
XA XB
XB XC
XN XX
HHH                                                                 1500                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        PPPA                                                   TTTT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

おすすめ記事