我有从1到n的文件,如下所示:
sim.o500.1
sim.o500.2
.
.
.
sim.o500.n
每个文件只包含一行。现在我想按照从1到n
的顺序连接它们。
我试过了cat sim.o500.* > out.dat
。可悲的是,如果例如这不起作用, n
大于9,因为这会连接sim.o500.1
后跟sim.o500.10
而非sim.o500.1
后跟sim.o500.2
。
如何使用数字顺序循环访问文件名?
答案 0 :(得分:2)
由于*
以非数字排序的方式展开,因此您最好使用seq
自行创建序列:这样,10
将在{{1}之后缩小等等。
9
注意我使用for id in $(seq $n)
do
cat sim.o500.$id >> out.dat
done
,以便您可以使用变量来指示序列的长度。如果此值恰好已修复且事先已知,则可以直接使用范围扩展来编写seq
值,如:n
。
答案 1 :(得分:2)
echo {1..12}
会打印
1 2 3 4 5 6 7 8 9 10 11 12
您可以使用此Bash的range expansion功能。
cat sim.o500.{1..20}
将以数字排序的顺序扩展为文件名,并且它是简洁的(较少的击键)。
有一点需要注意的是,如果文件数超过the limit,您可能会遇到“参数太多”错误。
答案 2 :(得分:1)
尝试
ls sim.o500.* | sort -t "." -n -k 3,3 | xargs cat > out.dat
说明:
<强> LS 强>
ls sim.o500.*
将生成一个文件名列表,匹配模式sim.o500.*
,并通过管道将其传递给sort
<强>排序强>
sort -t "." -n -k 3,3
会抓取所有这些文件名,并使用第三列(-n
)按降序对它们进行排序(-k 3,3
)并将其传递过来管道到xargs
。
-t "."
告诉sort使用.
作为分隔符,而不是像默认情况那样间隔字符。因此,以sim.o500.5
为例,第一列为sim
,第二列为o500
,第三列为5
。
<强> xargs的强>
xargs cat > out.dat
将启动cat
并附加从sort
通过管道接收的所有行作为命令参数。它的确如下:
execute("cat > out.dat sim.o500.1 sim.o500.2 sim.o500.3 ... sim.o500.n")
答案 3 :(得分:0)
> out.dat
for i in `ls -v sim*`
do
echo $i
cat $i >> out.dat
done
答案 4 :(得分:0)
如果您拥有文件夹中的所有文件,请尝试使用此命令:
cat $(ls -- sim* | sort) >> out.dat