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

时间:2015-04-01 11:48:05

标签: linux shell concatenation cat

我有从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

如何使用数字顺序循环访问文件名?

5 个答案:

答案 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