重複したフィールド値を持つ行の最初のインスタンスを削除する

重複したフィールド値を持つ行の最初のインスタンスを削除する

sha1はストレージサーバー上のすべてのイメージファイルを集計し、結果を次の形式のテキストファイルに保存しました。

sha1sumファイル名

ファイルをソートし、一意のsha1sumエントリをすべて削除しました。だから私に残ったのは重複ファイルのリストです。項目が2つの場合もあり、3つの場合もあり、それ以上の場合もあります。

私がしたいことは削除です。最初のみ結果出力を使用して重複ファイルを削除し、各ファイルのインスタンスを1つだけ保持できるように、各重複sha1sumエントリ

後ですべてのファイルをどのような形式のディレクトリ階層に移動するため、どのバージョンを保持するかはあまり気にしません。

ベストアンサー1

LinuxまたはCygwinでGNUユーティリティを使用すると、uniq同じハッシュ値を使用して各ファイルブロックを分離できます。uniqこのオプションを呼び出すと、--all-repeatedプロセスリストから一意のファイルが削除されます。

sha1sum * |
sort | uniq -w 40 --all-repeated=prepend |
sed -e '/^$/ { N; d; }' -e 's/^[^ ]*  //' |
tr '\n' '\0' | xargs -0 rm --

このシンプルで移植可能なスクリプトの努力は価値がありませんawk。最初のフィールドが前の行の最初のフィールドと同じ場合、各行を印刷します。今回もリストから一意のファイルが削除されます。

sha1sum * |
sort |
awk '$1==h {print}  {h=$1}' |
tr '\n' '\0' | xargs -0 rm --

この操作を手動で行うのではなく、ダイヤルできます。レプリカ

fdupes -f

おすすめ記事