【问题标题】:concatenate ordered files using cat on Linux在 Linux 上使用 cat 连接有序文件
【发布时间】:2015-06-06 01:15:06
【问题描述】:

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

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

【问题讨论】:

标签: linux shell concatenation cat


【解决方案1】:

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

for id in $(seq $n)
do
   cat sim.o500.$id >> out.dat
done

注意我使用seq,以便您可以使用变量来指示序列的长度。如果这个值恰好是固定的并且事先已知,您可以直接使用范围扩展写入n 值,例如:for id in {1..23}

【讨论】:

  • 我尝试了十个文件,但这只会连接第一个和第十个文件。我使用了循环条件for id in {1,10}
  • 操作!我的意思是for id in {1..10}。另一个错了,对不起。
  • 一点也不! {1,10} 也可以,但就像枚举 110 一样。
【解决方案2】:

试试

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")

【讨论】:

  • 这很好用,虽然我不明白。
  • @nerdizzle,我编辑了我的答案,试图解释发生了什么。
【解决方案3】:
> out.dat
for i in `ls -v sim*`
do
echo $i
cat $i >> out.dat
done

【讨论】:

    【解决方案4】:
    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,您可能会遇到“参数过多”错误。

    【讨论】:

    • 这很好!我在回答中提到了范围扩展,但没有考虑这样做。简单又好看,+1!
    • 谢谢,我实际上并不知道,我从问题下评论的 Related 问题中得到了这个提示。从某种意义上说,你的更好,因为它没有参数限制问题。
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      相关资源
      最近更新 更多