【问题标题】:bash sort a list starting at the end of each linebash 对从每行末尾开始的列表进行排序
【发布时间】:2016-09-23 11:25:45
【问题描述】:

我有一个包含文件路径和文件名的文件,我想从字符串末尾开始排序。

我的文件包含如下列表:

/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc

我想对这个列表进行排序,使文件名是连续的,这将有助于根据文件名查找重复项,而不管路径如何。

列表应如下所示:

/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc
/Volumes/Location/Workers/Charlie/2015-07-06_Charlie_PC/DOCS/4744128.doc

【问题讨论】:

  • 你有什么尝试吗?
  • 如果您的最终目标是查找重复项,则无需排序即可完成
  • 通常的想法是通过为每个文件生成一个 MD5 校验和并通过sort | uniq -d 运行它们以查找重复的内容,而不考虑文件名。
  • 在大多数操作中我使用 sort | uniq -d 但这不会排列列表,以便文件名部分是排序的主要项目。通过将文件名作为排序的主要元素,我可以发现我们在多个 Worker 中有重复的文件名。目标是一个没有任何重复文件名的文件夹树,无论路径如何。 90,000 多个文件的 MD5 计算可能需要一段时间。我最初尝试使用 awk 和 grep。 awk 不喜欢大文件列表。
  • Awk did not like the large file list - 这不是原因,因为awk 可以处理非常大的文件。可能是您将整个文件数据存储在内存中。

标签: bash sorting filelist


【解决方案1】:

这是一种方法:

sed -e 's|^.*/\(.*\)$|\1\t\0|' list.txt | sort | cut -f 2-

这使用sed 将文件名的副本插入到每行的开头,以便我们可以使用sort 对列表进行排序。然后我们删除我们在第一步中添加的东西。

【讨论】:

  • 没有不尊重,但你为什么不验证作者的尝试就回答问题?它基本上只是免费提供免费代码。
  • 工作就像一个魅力!非常感谢!
  • @Inian:我们免费提供免费代码和建议,无论 OP 付出多少努力。至少,即使作者发布了他的尝试,我也不记得曾经获得过报酬。
【解决方案2】:

这应该可行:

sort -t/ -k7 input_file

【讨论】:

  • 仅当所有路径具有相同数量的段时。如果你遇到/Volumes/Location/Jim/2016-09-23_Jim_PC/DOCS/Personal/1234.doc,那将会非常失败。它适用于 OP 发布的示例数据,但它不是一个好的通用解决方案。
  • @JimMischel:OP 没有要求通用解决方案。我更喜欢关注KISS principle
【解决方案3】:

这将根据以/ 分隔的动态最后一个字段进行排序。 首先它将最后一个字段附加到行首,然后是sort。前面附加的第一个字段被第二个awk 删除。

awk -F'/' '{ $0= $NF " " $0;print $0 |"sort -k1"}' fil  |awk '{print $2}'
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2017-07-21
    • 1970-01-01
    • 2015-06-29
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多