如何创建循环来连接目录中的文件组?

如何创建循环来连接目录中的文件组?

我有很多非常大的文件,需要很长时间才能手动加入。它们看起来像这样:

  • 文件_a1.txt
  • 文件_a2.txt
  • 文件_a3.txt
  • 文件_b1.txt
  • 文件_b2.txt
  • 文件_b3.txt
  • 文件_c1.txt
  • 文件_c2.txt
  • file_c3.txt等。如何使用循环将所有 a、所有 b、然后所有 c 连接在一起?

答案1

我假设“加入”意味着连接,而不是“使用命令在它们之间执行关系 JOIN 操作join”。此外,我假设文件名遵循以下模式:file_XN.txt其中X是某个字母和N某个数字,并且所有文件都位于当前目录中。

文件的串联是使用cat命令完成的,因此您必须使用所有“ a-files”调用 c​​at,然后调用“ b-files”等,同时将输出写入某个适当命名的文件。

for filename in ./file_[a-z]*.txt; do
    # extract the letter
    letter=${filename#*_}     # ./file_XN.txt --> XN.txt
    letter=${letter%[0-9]*}   # XN.txt --> X

    cat "$filename" >>"combined_$letter.txt"
done

这将循环遍历所有文件并从文件名中提取字母。然后,该字母将用于构造输出文件名,并且当前文件的内容将附加到该输出文件中。

默认情况下,数据将以与文件在目录中列出的顺序相同的顺序附加。

bash如果您正在使用并且确切地知道您想要遍历的字母(使用这里的a字母t),则另一种更短的方法是:

for letter in {a..t}; do
    cat "file_$letter"*.txt >"combined_$letter.txt"
done

在这里,我们不是循环文件名,而是循环字母,对于每个字母,我们一次性连接该字母的所有文件。

相关内容