如何交错两个文本文件中的行


77

交错两个(或更多)文本文件的行的最简单/最快的方法是什么?例:

文件1:

line1.1
line1.2
line1.3

档案2:

line2.1
line2.2
line2.3

交错式:

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

当然,编写一个可以同时打开它们和执行任务的Perl脚本很容易。但是我想知道是否有可能用更少的代码摆脱困境,也许是使用Unix工具的单一代码?

Answers:


146
paste -d '\n' file1 file2

3
在某些平台上的NBpaste相当有限-例如,在Solaris上,您最多可以有12个输入文件,而输出行则限制为511个字符。
user667489

然后在示例中将其与过程替换一起使用,paste -d '\n' <(find /) <(find /)并意识到这比首先以各种方式(磁盘使用,内存使用,并行化,可取消性)将结果写入文件的方式要好得多
masterxilo

1
paste!追溯到1979年的AT&T UNIX 32v。干得好,先生。
emallove18年

6

这是使用的解决方案awk

awk '{print; if(getline < "file2") print}' file1

产生以下输出:

line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc

awk 如果要向输出中添加一些额外的格式,例如,如果您要基于行来自哪个文件来标记每行,则使用可能很有用:

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1

产生以下输出:

1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc

注意:此代码假定file1的长度大于或等于file2。

如果file1包含的行多于file2,并且您希望在文件2完成后输出空白行,请在getline测试中添加else子句:

awk '{print; if(getline < "file2") print; else print ""}' file1

要么

awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1

2

@Sujoy的答案指出了一个有用的方向。您可以添加行号,对行号进行排序和删除:

(cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-

注意(我感兴趣的)这需要更多的工作来获得正确的排序,如果您使用命令输出而不是静态文件来代替静态文件,而这些命令的运行速度可能比彼此慢或快。在这种情况下,除了行号之外,您还需要添加/排序/删除其他标签:

(cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' )  \
   | sort -n  | cut -f2- | sort -n | cut -f2-

1

这是一种GUI方式:将它们粘贴到电子表格的两列中,将所有单元格复制出来,然后使用正则表达式用换行符替换制表符。


-1
cat file1 file2 |sort -t. -k 2.1

在此指定分隔符为“。” 并且我们正在对第二个字段的第一个字符进行排序。


我不明白这是怎么回事。例如,排序输入中是否没有冒号?你能解释更多吗?
弗兰克(Frank)2010年

我不好,将':'更改为'。它只是分隔符,如果未指定,则使用空白分隔字段。man sort有关更多信息。
Sujoy 2010年

7
该答案假定输入实际上采用问题中描述的文字形式。我认为那是说明性的。可以那样变换每个输入文件,但是可以更多地传递数据。codaddict的答案更好。
Phil Miller 2010年

@Novelocrat:是的,这只是另一种方式:)
Sujoy 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.