ソートせずに1つの列内の重複に基づいて行を削除します


30

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

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

回答:


31

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

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

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

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

awk -F',' '!seen[$3]++' filename

18

sortコマンドは、巨大なファイルを処理するためにすでに最適化されています。したがって、sortファイルでコマンドを非常にうまく使用できます。

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

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


-u重複したではなく、重複したキーのみを削除するようにコメントしました...しかし、私は間違っています。
ランダム

@Rameshそれは仕事をしますが、ソートは常に予想されるとは思わない行のシーケンスを変更します。
バーラト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.