繁体   English   中英

在Linux上使用cat连接有序文件

[英]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}

echo {1..12}

会打印

1 2 3 4 5 6 7 8 9 10 11 12

您可以使用此Bash的范围扩展功能来发挥自己的优势。

cat sim.o500.{1..20}

会以数字排序的顺序扩展到文件名,并且简洁(击键次数更少)。

一个警告是,如果文件数超过限制 ,则可能会出现“参数过多”错误。

尝试

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM