ソートせずに列の重複項目に基づいて行を削除する

ソートせずに列の重複項目に基づいて行を削除する

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

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

答え1

awkコマンドを重複行を削除したい列(あなたの場合は3番目の列)に変更します。

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

awkこのコマンドは印刷する行を知らせます。この変数は$3列3の内容全体を保持し、角かっこは配列アクセスです。したがって、ファイル名の3番目の列ごとに、そのノードseen(列3)の内容が以前!に設定されていない場合()、指定された配列のノードが増えて行が印刷されます。これにより、最初の行が常に保持されます(3番目の列のみ)。

上記は、入力ファイルの列がスペース/タブで区切られている場合に機能します。それ以外の場合は、optionsを使用してawkに通知する必要があります-F。たとえば、カンマ(,)で区切られた列があり、3番目の列に基づいて行を削除するには、次のコマンドを使用します。

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

答え2

sortこのコマンドは、大容量ファイルの処理に最適化されました。したがって、sortファイル内のコマンドをうまく使用できます。

sort -u -t' ' -k3,3 file
  • -u- 一意の行だけを印刷します。
  • -t- 区切り文字を指定します。この例では、空白のみの区切り文字として使用します。
  • -k3,3- 3番目のフィールドに基づいてソートします。

あなたは参照することができますこれ答えは、GNUソートが実際に大容量ファイルをソートするより良い方法であることを示唆しています。あなたの場合は、それがなくても-parallel大きな時間遅滞なく最終結果を得ることができると思います。

関連情報