bashスクリプト - 小さい値を持つ重複行を削除する

bashスクリプト - 小さい値を持つ重複行を削除する

以下はサンプルファイルです。

1 5 20 40 60
2 1 20 20 20
2 2 30 30 30
4 5 40 40 40
7 2 50 30 30
7 1 20 20 20

2番目の列(最初の列の同じ値)からより大きい値を持つ重複行を削除したいと思います。最初の列に一意の値を持つ行だけを維持したいと思います。この場合、重複した行があります。

2 1 20 20 20
2 2 30 30 30

そして

7 2 50 30 30
7 1 20 20 20

この場合、2番目の列の値が大きい行を削除したいと思います。

2 2 30 30 30

そして

7 2 50 30 30

したがって、私の目標は、次のファイルを選択して生成することです。

1 5 20 40 60
2 1 20 20 20
4 5 40 40 40
7 1 20 20 20

私の考えでは、awkでこれを行うことができたようです。

sort -nk2 | awk '{if(a[$1]){a[$1]=a[$1] } else {a[$1]=$0}}END{for (k in a) {print a[k]}}' | sort

しかし、小さなファイルには動作します。 (約100万行に達するファイルの場合)、より効率的なものにどのように変更できますか?

答え1

あなたはこれを自分で行うことができますsort。以下では、最初の項目はsort1列に基づいて昇順に並べ替えられ、次に2列にソートされます。次に、sort列 1 の各固有値のレコードを選択する 2 番目の項目にパイプされます。-s(安定ソート)フラグを渡して、列1の各値の最初のレコードのみを返すようにします。これは、前のソートのため、列2の最小値を持つレコードであることがわかります。

sort -k1,1n -k2,2n file | sort -k1,1n -s -u

関連情報