135

私はPythonでユーティリティスクリプトを持っています:

#!/usr/bin/env python
import sys
unique_lines = []
duplicate_lines = []
for line in sys.stdin:
  if line in unique_lines:
    duplicate_lines.append(line)
  else:
    unique_lines.append(line)
    sys.stdout.write(line)
# optionally do something with duplicate_lines

この単純な機能 (uniq最初にソートする必要がなく、安定した順序付け) は、単純な UNIX ユーティリティとして利用できる必要がありますね。たぶん、パイプ内のフィルターの組み合わせですか?

質問の理由: どこからでも Python を実行できないシステムでこの機能が必要です。

4

8 に答える 8

325

UNIX Bash Scripting ブログでは、次のように提案されています。

awk '!x[$0]++'

このコマンドは、出力する行を awk に指示しています。変数$0は行の内容全体を保持し、角括弧は配列アクセスです。そのため、ファイルの行ごとに、配列のノードxがインクリメントされ、そのノードの内容が事前に設定されていない場合 ( ) は行が出力され!ます。

于 2012-07-17T23:17:57.680 に答える
5

上記のMichael Hoffmanのソリューションは短くて甘いです。より大きなファイルの場合、awk を使用したインデックス フィールドの追加とそれに続く複数回の sort および uniq を含む Schwartzian 変換アプローチでは、メモリ オーバーヘッドが少なくなります。次のスニペットは bash で動作します

awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t'
于 2012-07-23T16:43:38.393 に答える