如何连接具有相同前缀(和许多前缀)的文件?

时间:2013-11-25 13:27:21

标签: linux bash

我有许多文件具有相同的前缀,只有下划线后的位不同。我也有很多前缀! 下划线不会出现在文件名中的任何其他位置。如何将具有相同前缀的所有文件连接到一个新文件? 我补充说我有数千个不同的前缀,我无法将它们提供给循环。

4 个答案:

答案 0 :(得分:5)

您可以执行以下操作:

cat /path/prefix* >> new_file

cat(即concatenate files and print on the standard output)所有名称与/path/prefix匹配的文件。文本的其余部分可能有所不同。

在执行之前,最好ls /path/prefix*确保它获取您想要考虑的所有(并且只有这些)文件。

实施例

$ ls
aa_bb  prefix_23  prefix_235  prefix_nnn
$ ls prefix_*
prefix_23  prefix_235  prefix_nnn

答案 1 :(得分:1)

我必须做一些非常相似的事情,我不觉得以前的答案在这里解决你的问题,因为如果有许多不同的前缀需要大量的手动输入,而不仅仅是一些包含大量文件的前缀使用相同的前缀。如果我知道你的前缀模式我可以给你更具体的建议,但是现在我只是假设你的前缀是用前导零编号(就像我的文件一样)。我将假设以下内容,但它们不一定是真的可以工作:

~/test01/001-test.txt
~/test01/002-test.txt
~/test01/003-test.txt

~/test02/001-test.txt
~/test02/002-test.txt
~/test02/003-test.txt

设置完成后,我将更改为合并目录,我希望将所有合并文件写入,然后在for循环中运行cat命令。

cd ~/merge

for i in {001..003}; do cat ../test*/"$i"*.txt > "$i"-merge.txt ; done

这将使用001,002和003作为前缀,并在所有测试目录中查找与这些前缀匹配的文件,并按照找到的顺序将它们合并在一起。最终结果将显示在:

~/merge/001-merge.txt
~/merge/002-merge.txt
~/merge/003-merge.txt

我知道这已经很晚了,但希望它可以帮助别人。我必须使用5000个前缀,所以我完全理解。

答案 2 :(得分:0)

如果你的文件数量非常大,那么有时只使用shell globbing(prefix_*之类的东西)是不合适的。

您可以使用循环并逐个追加它们:

find dir -type f -name 'prefix_*' -exec bash -c 'cat "{}" >> result' \;

这会将所有与prefix_*匹配的文件逐个附加到文件result(如果有疑问则不应该存在于开头,rm result)。

如果你有许多不同的前缀,你当然可以在另一组之后追加一个组而不删除其间的result文件。

当然,也可以使用Unix工具find提供的所有其他选项。但如果您需要帮助,请随时再次询问。

答案 3 :(得分:0)

我有一个类似的问题,有很多文件,想通过前缀对它们进行分组和cat,我使用了这个小脚本:

ls | awk -F '_' '!x[$1]++{print $1}' | while read -r line
do
    cat $line* > all_$line\.txt
done

ls将显示目录中的所有文件

awk-F '_'选项是将下划线设置为分隔符,代码本身就像uniq一样,意味着只打印每个前缀一次。

然后我们对所有前缀和cat所有前缀相同的文件运行循环。