删除具有重复字段值的行的第一个实例

删除具有重复字段值的行的第一个实例

我已 sha1 汇总了存储服务器上的所有图像文件,并将结果放入以下形式的文本文件中:

sha1sum 文件名

我已对文件进行了排序并删除了所有唯一的 sha1sum 条目。所以我剩下的是重复文件的列表。有些有两个条目,有些有三个,有些甚至更多。

我想做的是删除只有第一个每个重复 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

相关内容