按数字顺序并排粘贴多个文件

7

我有一个目录里有很多类似文件名的文件,比如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、......、file1000)?

例如:

file1

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 
....

file 3

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

粘贴 file1 到 file1000 文件内容并将其输出到 largefile 中。

largefile

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,这样就可以解决排序问题。 - Tony Hopkinson
我意识到在我的命令行中可能无法使用paste * > largefile,因为在之前的步骤之后,同一目录下还有其他文件。我只能处理特定名称的文件,如“file $n”。 - user1687130
3个回答

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

bashжҲ–иҖ…zshжҲ–иҖ…ksh93гҖӮиҜҘиҜӯжі•иө·жәҗдәҺzshгҖӮ - Stephane Chazelas

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*

2

使用 zsh

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

<x-y>用于匹配从xy的正十进制整数。x和/或y可以省略,因此<->是任何正十进制整数。它也可以写成[0-9]##(其中##zsh等价于正则表达式+)。

(n)globbing qualifiers(全局通配符)。n全局通配符打开数字排序,它按照文件名中出现的所有十进制数字序列进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接