以下はサンプルファイルです。
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
。以下では、最初の項目はsort
1列に基づいて昇順に並べ替えられ、次に2列にソートされます。次に、sort
列 1 の各固有値のレコードを選択する 2 番目の項目にパイプされます。-s
(安定ソート)フラグを渡して、列1の各値の最初のレコードのみを返すようにします。これは、前のソートのため、列2の最小値を持つレコードであることがわかります。
sort -k1,1n -k2,2n file | sort -k1,1n -s -u