web-dev-qa-db-ja.com

並べ替えなしで1つの列内の重複に基づいて行を削除する

大きな3列のファイル(約10,000行)があり、その行の3番目の列の内容が別の行の3番目の列に表示される場合、行を削除したいと思います。ファイルのサイズによって並べ替えが少し面倒になり、行全体が同一ではないため、以下のコードのようなものは使用できません。列3の内容のみ。

awk '!seen[$0]++' filename
31
Zach C

Awkコマンドを実行する列に変更するだけで、重複した行を削除します(この場合は3番目の列)。

awk '!seen[$3]++' filename

このコマンドは、印刷する行をawkに指示しています。変数$3は列3の内容全体を保持し、角括弧は配列アクセスです。したがって、filenameの行の3番目の列ごとに、seenという名前の配列のノードがインクリメントされ、そのノード(column3)の内容が以前に(!)に設定されていなかった場合、行が出力されます。

上記のawkコマンドは、入力ファイルの列がそれらの間でspaceまたはTabで区切られている場合に機能します。列が別のもので区切られている場合は、awkに指示する必要があります-Fオプション付き。したがって、たとえば、すべての列がコンマ(,)で区切られていて、3番目の列に基づいて行を削除する場合は、-F','オプションを使用します。

awk -F',' '!seen[$3]++' filename
32
αғsнιη

sortコマンドは、巨大なファイルを処理するようにすでに最適化されています。したがって、次のようにファイルでsortコマンドを使用することもできます。

sort -u -t' ' -k3,3 file
  • -u-一意の行のみを出力します。
  • -t-区切り文字を指定します。この例では、スペースを区切り文字として使用しています。
  • -k3,3-3番目のフィールドでソートします。

あなたは this 回答を参照することができますGNU sortは実際には大きなファイルをソートするためのより良いアプローチです。あなたの場合、-parallelがなくても、多くの時間遅延なしに最終結果を達成します。

18
Ramesh