パターンマッチングを使用してテキストファイルの各行を解析します。

パターンマッチングを使用してテキストファイルの各行を解析します。

再フォーマットする必要がある行が多いテキストファイルがありますが、停止しました。各行にはHeaderSegmentが含まれ、その後にサブセグメントを含めることができる1つ以上の詳細セグメントが含まれています。

ファイルを読み、パターンを一致させ、「何かをする」必要があります(以下の説明を参照)。

これは私のテキストファイルの2行の例です。 (HeaderSegment で始まる)

HeaderSegment:1234:989898:51:2101211748:29:DetailSegment:123467:654321:2:20210122112325:C:0:0:Purchased:SubSegment:064:null:Cash:Whaler:DetailSegment:123468:814211:1:20210121233042:N:0:147:Refund:SubSegment:000:null:Check:Everglades:DetailSegment:234569:825455:1:20210121233113:N:0:685:Purchased:SubSegment:000:null:Cash:Key West:DetailSegment:201754:663854:2:20210122012327:P:128:128:Purchased:SubSegment:000:null:null:null
HeaderSegment:1234:989898:22:2101211750:28:DetailSegment:55555:6637948:0:20210122013332:N:0:401:Refund:SubSegment:000:null:Credit:Whaler
HeaderSegment:1234:989898:22:2101211750:28:DetailSegment:55555:6637948:0:20210122013332:N:0:401:Sale:SubSegment:000:null:Credit:Whaler:SubSegment:30757:null:Cash:Whaler:SubSegment:25500:null:Credit:Seavee

HeaderSegmentは常にHeaderで始まり、5つのデータフィールドを含みます。

DetailSegmentは常にDetailSegmentで始まり、8つのデータフィールドを含み、1つ以上のSubSegmentが接続されています。

SubSegmentsはDetailSegmentsに接続され、4つのデータフィールドを含みます。

1行あたりのヘッダーは1つだけですが、詳細セクションとサブセクションは複数あります。

テキストファイルの各行を解析し、詳細セグメントごとに1行に複数の行を含む新しい出力を作成する必要があります。この行には以下が含まれます。

  • ヘッダーセクション
  • 詳細セクション
  • DetailSegmentと次のサブセグメントの間にある各サブセグメントの最初のフィールドの合計です(同じ行に2つのサブセグメントがある場合)。
  • フィールド区切り文字を次に変更する必要があります。

出力例は次のとおりです。

1234,989898,51,2101211748,29,123467,654321,2,20210122112325,C,0,0,Purchased,064
1234,989898,51,2101211748,29,123468,814211,1,20210121233042,N,0,147,Refund,000
1234,989898,51,2101211748,29,234569,825455,1,20210121233113,N,0,685,Purchased,000
1234,989898,51,2101211748,29,201754,663854,2,20210122012327,P,128,128,Purchased,000
1234,989898,22,2101211750,28,55555,6637948,0,20210122013332,N,0,401,Refund,000
1234,989898,22,2101211750,28,55555,6637948,0,20210122013332,N,0,401,Sale,56257

私はawkを使ってみましたが、awkの知識が不足してセグメントを分割するのに問題があります。

誰かがガイダンスを提供できることを願っています(推奨ソリューションの説明は、これをより簡単に「学習」するのに役立ちますので、大歓迎です)。

ベストアンサー1

awk -F':?(Header|Detail)Segment:' '
    { sumPos=10;
      for(i=3; i<=NF; i++) { 
          split($i, tmp, ":")
          for(x in tmp) { 
              sum+=tmp[sumPos]; sumPos+=5
          };
          gsub(/:|:SubSegment.*/, ",", $i)
          gsub(/:/, ",", $2)
          printf("%s,%s%.3d\n", $2, $i, sum)
          sum=0
      };
}' infile

おすすめ記事