パターンマッチングを使用してカスタムデータをフォーマットしようとしています。予想される形式を取得できませんでした。シェルスクリプトについてはよくわかりませんが、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つのデータセットを一致するパターンに結合することです。まずパターンを検索してから、一致したらパターンをもう一度検索してくださいWWWW
。PPPA
その後、この特定のデータブロックの開始レコードと終了レコードがマージされます。
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
ために使用する前のフッター値を保存します。sum
END
- 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