大きな3列のファイル(約10,000行)があり、その行の3番目の列の内容が別の行の3番目の列に表示される場合、行を削除したいと思います。ファイルのサイズによって並べ替えが少し面倒になり、行全体が同一ではないため、以下のコードのようなものは使用できません。列3の内容のみ。
awk '!seen[$0]++' filename
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
sort
コマンドは、巨大なファイルを処理するようにすでに最適化されています。したがって、次のようにファイルでsort
コマンドを使用することもできます。
sort -u -t' ' -k3,3 file
-u
-一意の行のみを出力します。-t
-区切り文字を指定します。この例では、スペースを区切り文字として使用しています。-k3,3
-3番目のフィールドでソートします。あなたは this 回答を参照することができますGNU sortは実際には大きなファイルをソートするためのより良いアプローチです。あなたの場合、-parallel
がなくても、多くの時間遅延なしに最終結果を達成します。