1

列 2 に基づいて列 3 を比較する awk コマンドがあります。列 2 (ID) が等しい場合、列 3 (クーポン) を比較して値が異なるかどうかを確認し、0 または 1 としてフラグを立てます。

awk 'BEGIN{OFS=" ";} NR==1 { print; next } { print $0, ($2 == a) ? (($3 == b) ? "0" : "1") : "0"; a = $2; b = $3 }' testv1.txt

サンプル入力。

Month    ID Coupon  Reprice
2013-12  2  4.00    
2014-01  2  4.00    
2014-02  2  4.50    
2014-03  2  4.50    
2013-10  3  3.00    
2013-11  3  3.00    
2013-12  3  3.25    
2014-01  3  3.25    
2014-02  3  3.25    
2014-03  3  3.50

これが現在の出力です。

Month    ID Coupon  Reprice
2013-12  2  4.00    0
2014-01  2  4.00    0
2014-02  2  4.50    1
2014-03  2  4.50    0
2013-10  3  3.00    0
2013-11  3  3.00    0
2013-12  3  3.25    1
2014-01  3  3.25    0
2014-02  3  3.25    0
2014-03  3  3.50    1

私が望むのは、ID が同じ場合、reprice フラグ値 1 を 1 回だけ発生させることです (最後の reprice フラグは 1 ではなく 0 になります)。

Month    ID Coupon  Reprice
2013-12  2  4.00    0
2014-01  2  4.00    0
2014-02  2  4.50    1
2014-03  2  4.50    0
2013-10  3  3.00    0
2013-11  3  3.00    0
2013-12  3  3.25    1
2014-01  3  3.25    0
2014-02  3  3.25    0
2014-03  3  3.50    0

投稿ミス申し訳ありません。

4

1 に答える 1

2

連想配列を使用します (また、次回はサンプル入力を提供します)。

awk 'BEGIN{OFS=" ";} NR==1 { print; next } { v = ($2 == a) ? (($3 == b) ? "0" : "1") : "0"; } v == "1" && reprice[$2] { v = "0"; } { print $0, v; a = $2; b = $3 } v == "1" {reprice[$2] = 1}' testv1.txt

説明:

{ v = ($2 == a) ? (($3 == b) ? "0" : "1") : "0"; }Reprice 列の値を計算します

v == "1" {reprice[$2] = 1}再価格が発生したことを示します (再価格が発生した場合にのみトリガーされますv == "1") 。

v == "1" && reprice[$2] { v = "0"; }"0"指定された ID の再価格がすでに表示されている場合は、 再価格を に設定します。

{ print $0, v; a = $2; b = $3 }データを印刷します

于 2013-10-03T18:48:10.853 に答える