在 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.10 而不是 sim.o500.1 后跟 sim.o500.2.

如何使用数字顺序遍历文件名?

由于 * 以非数字排序方式扩展,您最好使用 seq 自己创建序列:这样,10 将在 [=14 之后出现=],等等

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 将获取所有这些文件名并使用 3rd 列(-k 3,3 将它们按降序排列为数字(-n) ) 并将其通过管道传递给 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")
> out.dat
for i in `ls -v sim*`
do
echo $i
cat $i >> out.dat
done
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,您可能会遇到 "too many arguments" 错误。

如果一个文件夹中有所有文件,请尝试使用此命令:

cat $(ls -- sim* | sort) >> out.dat