根据文件名相似性连接多个文件:Windows Bash(使用 Windows 10)、Powershell 或命令行)

根据文件名相似性连接多个文件:Windows Bash(使用 Windows 10)、Powershell 或命令行)

我目前陷入了看似简单的任务中。我一直在编写一个 Python 脚本,该脚本可在我的下载文件夹中找到某些文件并将它们转储到另一个文件夹内的另一个子文件夹中。然后,它将指定文件夹中的 PDF 转换为文本文件,因为我将从文件中提取信息(使用 TXT 更容易)。

现在,我陷入了下一部分:我有大约 600 个文件(并且还会有更多),并且想要根据文件名合并文件。文件名的格式如下...

  • Txt_BI_ProfilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf
  • Txt_BI_BrofilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf (1)
  • Txt_BI_ProfilesBI_Profile_Export_Search_20170228.pdf
  • Txt_BI_ProfilesBI_Profile_Export_Search_20170228.pdf (1)

请注意,有些文件共享文件名,但可以通过 .pdf(1) 区分。我需要一个 powershell 或 bash 脚本,根据文件名相似性将文件分组并合并为合并的文本文件。

因此,给定上述文件名,我想合并

'TxtBI_ProfilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf'+'Txt_BI_ProfilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf (1)' 放入文件 ='BB+Generic_August+2016_GGP'

“搜索” 也是如此。对于'BB+Generic_August+2016_GGP''搜索'组中最多有大约 '.pdf(40)' 个不同的文件,并且有大约 10 个或更多不同的文件组共享相似的文件名。我编写了一个 python 脚本来尝试执行此操作这里但它所做的只是拆分 filenames[33:] 和 filenames.rsplit('',1)[0](在第 33 个字符和最后一个 '_' 后拆分),而不是像我上面提到的那样将它们合并为合并文件。我可以用 powershell 或 bash 做到这一点吗?这样它就可以拆分文件名(如上所述),然后如果它们具有相同的文本文件名,则将它们合并?

我以为这会非常简单,但对我来说却行不通。如果有人对如何解决这个问题有任何见解/想法/建议,我将不胜感激!以前在 unix 上使用过 bash,但已经有一段时间了。我会选择最实用的!在编程方面还是个新手……

答案1

编辑:产生所需输出文件名的更好的解决方案

利用lsawkcat

ls | awk '! /\([0-9]+\)/ {match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches); system("cat " $0 "* >"matches[1] ".txt")}'

在 Matthew 展示 Powershell 功能后,我展示在 bash 环境中也可以实现相同的功能。这只是 UNIX 世界中常见的众多方法之一。

解释:

ls列出当前目录中的所有元素

awk为文本处理而设计的编程语言

! /\([0-9]+\)/排除包含括号内数字的文件名

match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches)对文件名执行正则表达式匹配,捕获公共前缀和第一个点之间的部分

system("执行系统命令

cat " $0 "*连接以文件名开头的文件

>"matches[1] ".txt"输出到与捕获的表达式同名且扩展名为 .txt 的文件


第一个答案: 您可以使用findxargsbashcat

find . -type f -regextype sed ! -regex "\./.*([0-9]\+)" | xargs -I{} bash -c 'cat {}* > {}.txt'

这更像是一个概念验证,可以进行改进,因为输出文件名并不完全是您想要的,但应该足以立即解决您的问题。

解释:

find .搜索当前目录

-type f查找文件

-regextype sed使用与 sed 兼容语法的正则表达式引擎

! -regex "\./.*([0-9]\+)"排除与指定正则表达式匹配的结果,即末尾包含括号中的数字的结果

| xargs使用每个结果构建一个命令

-I{}在以下命令中,{}用每个find结果替换

bash -c将以下字符串作为命令传递给bash

'cat {}* > {}.txt'将以找到的文件名开头的文件连接成一个文件,该文件的名称由结果find.txt扩展名组成

相关内容