我目前正在从事一个数学项目,但在使用 bash 编程时遇到了一点困难。
目前我有一个包含 800 个文本文件的目录,我想做的是运行一个循环以 cat 前 80 个文件(_01 到 _80)到一个新文件中并保存在其他地方,然后是接下来的 80 个(_81 到 _160)个文件等。
目录中的所有文件如下所示:ath_01、ath_02、ath_03 等。
有人能帮忙吗?
到目前为止我有:
#!/bin/bash
for file in /dir/*
do
echo ${file}
done
这只是简单地列出了我的文件。我知道我需要以某种方式使用 cat file1 file2 > newfile.txt 但它混淆了我与 _01、_02 等的数字扩展。
如果我将文件名更改为使用下划线以外的名称,会有帮助吗?像 ath.01 等?
干杯,
最佳答案
因为你提前知道你有多少文件以及它们是如何编号的,“展开循环”可能更容易,可以这么说,使用复制粘贴和一些手工调整来编写使用大括号扩展的脚本。
#!/bin/bash
cat ath_{001..080} > file1.txt
cat ath_{081..160} > file2.txt
cat ath_{161..240} > file3.txt
cat ath_{241..320} > file4.txt
cat ath_{321..400} > file5.txt
cat ath_{401..480} > file6.txt
cat ath_{481..560} > file7.txt
cat ath_{561..640} > file8.txt
cat ath_{641..720} > file9.txt
cat ath_{721..800} > file10.txt
否则,使用嵌套的 for 循环和 seq
命令
N=800
B=80
for n in $( seq 1 $B $N ); do
for i in $( seq $n $((n+B - 1)) ); do
cat ath_$i
done > file$((n/B + 1)).txt
done
外层循环将遍历 n
到 1、81、161 等。内层循环将遍历 i
1 到 80,然后是 81 到 160,等等。如果第 i
个文件到标准输出,则内部循环的主体只是将内容转储到标准输出,但循环的聚合输出存储在文件 1 中,然后是文件 2,等等。
关于macos - 带有数字名称的 bash for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186985/