我试图将所有文本文件合并到一个文件中。所有文本文件都有一列和相同的行数。我的数据文件名为 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