我有很多非常大的文件,需要很长时间才能手动加入。它们看起来像这样:
- 文件_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”调用 cat,然后调用“ 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
在这里,我们不是循环文件名,而是循环字母,对于每个字母,我们一次性连接该字母的所有文件。