如何交错来自两个文本文件的行

Posted

技术标签:

【中文标题】如何交错来自两个文本文件的行【英文标题】:How to interleave lines from two text files 【发布时间】:2011-04-30 00:50:59 【问题描述】:

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

文件 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 工具的单行代码?

【问题讨论】:

【参考方案1】:
paste -d '\n' file1 file2

【讨论】:

注:在某些平台上paste 相当有限 - 例如在 Solaris 上,您最多可以有 12 个输入文件,并且输出行限制为 511 个字符。 然后在paste -d '\n' <(find /) <(find /) 之类的示例中将其与进程替换一起使用,并意识到这比首先以各种方式将结果写入文件要好得多,磁盘使用情况,内存使用情况,并行化,可取消性... 哇,paste!回到 1979 年,AT&T UNIX 32v。干得好,先生。 哇,一个非常简洁的解决方案!【参考方案2】:
cat file1 file2 |sort -t. -k 2.1

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

【讨论】:

我不明白这是如何工作的。例如,排序输入中没有冒号?你能解释更多吗? 我的错,将 ':' 更改为 '.'它只是分隔符,如果未指定排序使用空白来分隔字段。 man sort 了解更多信息。 此答案假定输入实际上采用问题中描述的文字形式。我认为这应该是说明性的。以这种方式转换每个输入文件是可能的,但它会更多地通过数据。 codaddict 的回答更好。 @Novelocrat:是的,这只是另一种方式:)【参考方案3】:

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

【讨论】:

【参考方案4】:

这是使用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 并且您想在 file2 完成后为它输出空行,请在 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

【讨论】:

【参考方案5】:

@Sujoy's answer 指向一个有用的方向。您可以添加行号、排序和去除行号:

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

【讨论】:

【参考方案6】:

使用 GNU sed:

sed 'R file2' file1

输出:

线1.1 线2.1 线1.2 线2.2 线1.3 线2.3

【讨论】:

以上是关于如何交错来自两个文本文件的行的主要内容,如果未能解决你的问题,请参考以下文章

将固定长度的逐行文本文件转换为 SQL 并转置

如何使 SwiftUI 文本多行文本对齐从顶部和中心开始

linux下如何获得特定字符串前后几行文本

安卓开发 listview中给指定行文本框赋值的问题

如何从 Python 创建 PDF 文件,包括图像和文本? [关闭]

如何创建带有两行文本且第一行文本大于第二行的 UIButton?