bashスクリプト - 行の削除と列値の減少

bashスクリプト - 行の削除と列値の減少

だから私のファイルには3つの列があります。

9 1 2
2 2 1
5 3 1
7 3 1
5 3 1
2 3 1
8   2 1
3 2 1
1 1 1

最初の列から特定の値と2、5などの関連行(同じ列に複数回表示)を削除し、その値より大きい最初の列のすべての値を減らしたいと思います。したがって、最初に数字2を削除すると、次のようになりたいと思います。

8 1 2

4 3 1
6 3 1
4 3 1

7 2 1
2 2 1
1 1 1

5(現在4)私の出力は次のとおりです。

7 1 2


5 3 1


6 2 1
2 2 1
1 1 1

どうすればいいですか?実際のケースでは、多くの値を削除する必要があり、ファイル容量が非常に大きいことを考慮すると。

ベストアンサー1

bash+awk解決策:

i=0;
for n in 2 5; do
    awk -v n="$n" -v iter=$((++i)) \
   'iter == 1{ 
        if ($1 > n) { $1-- } else if ($1 == n) { next }
    }
    iter > 1{
        if ($1 + 1 == n){ next } else if ($1 >= n) $1-- 
    }1' inp_file > tmp_inpfile && mv tmp_inpfile inp_file
done

最終inp_fileコンテンツ:

7 1 2
5 3 1
6 2 1
2 2 1
1 1 1

おすすめ記事