###前提・実現したいこと
BASHです
ただ、ロジック、というかアルゴリズム、というか考え方自体を知りたいです!
最初のデータを示すと、以下のことを実現したいと思ってます
in
aa bb date no cd price qty
test 2101813 20170906 001602 2132650430401 0.00 1
test 2101813 20170906 001602 2132650430401 0.00 1
test 2101813 20170906 001602 2132650430401 0.00 1
test 2101813 20170906 001603 2132650430401 0.00 1
test 2101813 20170906 001603 2132650430409 0.00 1
test 2101813 20170906 001603 2132650431301 0.00 1
test 2101813 20170906 001604 2132650430401 0.00 -1
test 2101813 20170906 001604 2132650430401 0.00 -1
out
aa bb date no cd price qty
test 2101813 20170906 001602 2132650430401 0.00 1
test 2101813 20170906 001603 2132650430401 0.00 1
test 2101813 20170906 001603 2132650430409 0.00 1
test 2101813 20170906 001603 2132650431301 0.00 1
aa,bb,date,cdをキーとして、(price*qty)がちょうどマイナスとプラスで絶対値が一致するデータを相殺して表示しないようにしたいです
なお、キーが一致するレコードは複数存在しうります
マイナスデータはあぶれたぶんはそのまま次の処理に渡すイメージ、
プラスデータも同様
マイナスデータに対応した個数分プラスデータもあわせて削除するイメージです
マイナスやプラスデータはどの場所にあってもおかしくないです
マイナスデータ及びそれに対応したプラスデータは一種類とは限りません
コードはすいませんが、現場独自のコマンドを多用している状態なので、ここでは載せられません
この部分のロジックをどうやって実現するかで、詰まっています
見づらいと思いますが、すいませんがロジックや考え方を教えていただけるとありがたいです
###現状困っている点
現状は、マイナスデータを最初にすべて抽出して、それを回したwhileループ中で、
マイナスデータとキーがすべて一致する、かつ、price*qtyの絶対値が一致する
というデータの行数を一行取得して、その後awk中のexitで次のwhileループに入る、という形をとっています
ただ、これだとキーが重複するレコードがマイナス、プラスともに複数あった場合に、プラスのほうのデータを一つしか相殺することができないので困ってます・・
while 必要なカラム(qtyがマイナスであるレコードの各カラム) ; do cat 元データ | awk ' if(キー値がすべてwhileループで回っているそれと一致すること){ prc=((%price*%qty)) prc_minus=(("'"$price"'"*"'"$qty"'"*-1)) if(prc==prc_minus){print NR" t";print "'"$nr"'"" t";exit;} ##ここでexitすることで次のwhileループへ行く } ' done > 行数と削除フラグを持った中間ファイル
イメージ上記のように組んでいる現状です。。
###補足情報(言語/FW/ツール等のバージョンなど)
bashで使ってます!
回答2件
あなたの回答
tips
プレビュー