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

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

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

答え2

また、使用することができますawk 'a[$1]++'

$ gsha1sum *
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  file1
e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98  file2
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  file3
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  file4
$ gsha1sum *|awk 'a[$1]++'
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  file3
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  file4

Gillesが投稿したコマンドと同様に、入力の最初のフィールドが一度だけ表示される行も削除されます。

a[$1]++a[$1]++>0またはで置き換えることができます++a[$1]>=2

関連情報