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
大きな時間遅滞なく最終結果を得ることができると思います。