我有一个包含不同文本文件的目录,例如:
ajac001a00.24o
ajac001a15.24o
ajac001a30.24o
.
.
areg001a00.24o
areg001a15.24o
areg001a30.24o
.
.
我需要分别合并这些文本文件,以相同的四个字符开头,例如
cat *ajac* > ajac_combined
cat *areg* > areg_combined
我如何使用循环来做到这一点?存在太多以不同字符开头的文件,因此无法手动使用 cat 命令完成此操作。
你可以将所有文件收集到一个数组中,然后截取前 4 个字符以获取前缀列表,然后遍历前缀以合并文件。如下所示:
正在
printf '%s\n' "${files[@]}" | cut -c1-4 | sort -u
执行繁重的工作。首先,该printf
命令将数组的每个元素打印$files
在单独的行上。这为我们提供了文件名列表,然后我们使用 选择前 4 个字符cut -c1-4
。请注意,这假设简单的 ASCII 文件名,没有 unicode,因此每个字符都是一个字节。然后我们传递前缀列表sort -u
以删除重复项,然后将它们提供给循环。我使用了
cat "$prefix"*
而不是像cat *"$prefix"*
您在问题中那样,因为这些都是前缀并且在它们之前没有什么可以匹配。在 Bash 中你可以这样做:
这意味着:对于当前工作目录中的每个文件,按照 Bash 的通配规则(即先按数字排序,然后按字符排序,再按字母顺序排序)按名称排序,将文件内容附加到以文件名的前 4 个字符命名的文件中,后跟
_combined
。作为参考,这些文件名的排序方式如下:
这意味着名为
ajac*
、按字母数字排序的文件将被合并到 中ajac_combined
,名为 、按字母数字排序的文件areg*
将被合并到 中,areg_combined
依此类推。如果需要将其限制为以 结尾的文件名
.24o
:您可以在一行命令中完成此操作:
“ls -w 1” 将在单个列中列出所有文件,并且只列出文件名,没有其他详细信息。
awk 命令将获取每一行,并运行系统命令 cat 文件($1 = filename)到以相同的 4 个字母开头并以 _combined 结尾的文件。
中间的 >> 表示附加,因此它将添加到文件中,如果没有文件,它将创建它。
请注意整个 awk 命令的单引号和 cmd 中的静态文本的双引号。