[英]concatenate ordered files using cat on Linux
我的文件从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.1
后接sim.o500.10
而不是sim.o500.1
后接sim.o500.2
。
如何使用数字顺序遍历文件名?
由于*
以非数字排序方式扩展,因此您最好自己使用seq
创建序列:这样, 10
将在9
之后出现,以此类推。
for id in $(seq $n)
do
cat sim.o500.$id >> out.dat
done
注意我使用seq
以便您可以使用变量来指示序列的长度。 如果此值恰好是固定的且事先已知,则可以直接使用范围扩展将n
值写为: for id in {1..23}
。
尝试
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
sort -t "." -n -k 3,3
将获取所有这些文件名,并使用第3列( -k 3,3
)将它们按降序排序为数字( -n
),并将其通过管道传递给xargs
。
-t "."
告诉排序使用.
作为分隔符,而不是默认情况下的空格字符。 因此,以sim.o500.5
为例,第一列为sim
,第二o500
,第三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")
> out.dat
for i in `ls -v sim*`
do
echo $i
cat $i >> out.dat
done
如果文件夹中包含所有文件,请尝试使用以下命令:
cat $(ls -- sim* | sort) >> out.dat
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.