将所有文件合并到一个文件中?

将所有文件合并到一个文件中?

我试图将所有文本文件合并到一个文件中。所有文本文件都有一列和相同的行数。我的数据文件名为 data_1.txt、data_2.txt、data_3.txt、. 。 。数据_n.txt。其中 n 是要合并的文本文件的数量。我想要按顺序从 1 到 n 进行合并。我尝试了以下代码,但它没有按我想要的方式工作。它不保持列顺序。

我的样本数据看起来像

数据_1.txt

0.020085
0.0017361
0.77963
0.98659
0.33102
0.099835
0
0
0.073004
0.29978

数据_2.txt

0.021407
0.0017191
0.82385
1.0449
0.34593
0.10535
0
0
0.078362
0.31509

数据_3.txt

0.022706
0.0016876
0.85447
1.0922
0.35556
0.11063
0
0
0.083983
0.32536

所需输出

组合.txt

0.020085    0.021407    0.022706
0.0017361   0.0017191   0.0016876
0.77963 0.82385 0.85447
0.98659 1.0449  1.0922
0.33102 0.34593 0.35556
0.099835    0.10535 0.11063
0   0   0
0   0   0
0.073004    0.078362    0.083983
0.29978 0.31509 0.32536

您能帮我解决我的问题吗?

#!/bin/bash
paste data_*.txt > combined.txt

答案1

使用zsh,您可以使用 glob 限定符影响文件名生成的顺序:

paste file_*.txt(n)

会打开数字排序,即放入file_10.txt file_9.txt

请注意,如果您的文件以 CR 字符结尾(当它们来自 Microsoft 世界时),则在输出到终端时,该字符会将光标移动到第一列。

因此,对于包含的文件A\rB\rC\rn(如果您有 3 个 MS-DOS 格式的文件,就会发生这种情况paste),cat that-file似乎只显示C.您可以通过将以上内容通过管道传递到来摆脱这些 CR 字符tr -d '\r'

答案2

您可以使用大括号扩展withpaste强制排序:

$ paste data_{1..3}.txt
0.020085    0.021407    0.022706
0.0017361   0.0017191   0.0016876

大括号扩展为多个单词,每个单词都有大括号左侧和右侧的部分。语法n..m序列表达:

序列表达式采用 {x..y[..incr]} 形式,其中 x 和 y 是整数或单个字符,而 incr(可选增量)是整数。当提供整数时,表达式将扩展为 x 和 y 之间的每个数字(包括 x 和 y)。

上面的命令行将扩展为:

paste data_1.txt data_2.txt data_3.txt

其中包括按正确顺序排列的文件。您可以将 更改3为任意文件数量以获得所有适当的文件名。

paste命令按照作为参数给出的顺序将其文件参数按列连接在一起,因此参数的顺序很重要。当您使用文件名时*,文件名按字母顺序扩展,当您有 10 个或更多文件时,这将是错误的,因此列最终会乱序。对于 1-9 个文件,无论哪种方式都可以。

答案3

paste -d " " 1.txt 2.txt > 4.txt

还有另一种使用方法awk

$ awk '{printf "%s",$1; getline < "1.txt" ; printf " %s\n",$1}' 2.txt

相关内容