在 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
我有文件 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