【问题标题】:Paste side by side multiple files by numerical order按数字顺序并排粘贴多个文件
【发布时间】:2013-06-12 20:47:54
【问题描述】:

我在一个目录中有许多文件,它们的文件名相似,例如 file1、file2、file3、file4、file5、.....、file1000。它们的维度相同,每一个都有 5 列和 2000 行。我想将它们按数字顺序并排粘贴到一个大文件中,因此最终的大文件应该有 5000 列和 2000 行。

我试过了

for x in $(seq 1 1000); do 
paste `echo -n "file$x "` > largefile
done

不是在命令行中写入所有文件名,有没有办法可以按数字顺序粘贴这些文件(file1、file2、file3、file4、file5、...、file10、file11、...、文件 1000)?

例如:

文件1

1 1 1 1 1
1 1 1 1 1 
1 1 1 1 1
...

文件2

2 2 2 2 2 
2 2 2 2 2
2 2 2 2 2 
....

文件 3

3 3 3 3 3 
3 3 3 3 3 
3 3 3 3 3
....

粘贴文件1 文件2 文件3 .... 文件1000 > 大文件

大文件

1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
....

谢谢。

【问题讨论】:

  • 重新命名文件,将前导 0 放入其中会解决问题
  • 我意识到我可能无法在命令行中使用 paste * > largefile,因为在前面的步骤之后,同一目录中还有其他文件。我必须处理具有特定名称的文件,例如“file$n”。

标签: shell paste


【解决方案1】:

如果你当前的 shell 是 bash:paste -d " " file{1..1000}

【讨论】:

  • bashzshksh93。该语法起源于zsh
【解决方案2】:

你需要用前导零重命名文件,比如

paste <(ls -1 file* | sort -te -k2.1n) <(seq -f "file%04g" 1000) | xargs -n2 echo mv

以上内容适用于“试运行” - 如果您满意,请删除 echo...

或者你可以使用例如perl

ls file* | perl -nlE 'm/file(\d+)/; rename $_, sprintf("file%04d", $1);'

以后可以

paste file*

【讨论】:

    【解决方案3】:

    zsh:

    setopt extendedglob
    paste -d ' ' file<->(n)
    

    &lt;x-y&gt; 是匹配从xy 的正十进制整数。 x 和/或y 可以省略,所以&lt;-&gt; 是任何正十进制整数。它也可以写成[0-9]####zsh 等价于正则表达式+)。

    (n)通配符n globbing 限定符打开数字排序,对文件名中出现的所有十进制数字序列进行排序。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 2015-05-07
      相关资源
      最近更新 更多