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

Fra*_*ank 74 unix linux command

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

档案1:

line1.1
line1.2
line1.3
Run Code Online (Sandbox Code Playgroud)

文件2:

line2.1
line2.2
line2.3
Run Code Online (Sandbox Code Playgroud)

交错的:

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3
Run Code Online (Sandbox Code Playgroud)

当然,编写一个小的Perl脚本很容易打开它们并完成任务.但我想知道是否可以使用更少的代码来逃避,也许是使用Unix工具的单行程?

cod*_*ict 136

paste -d '\n' file1 file2
Run Code Online (Sandbox Code Playgroud)

  • NB在某些平台上`paste`相当有限 - 例如在Solaris上,最多可以有12个输入文件,输出行限制为511个字符. (3认同)
  • 哇,[`paste`](https://en.wikipedia.org/wiki/Paste_(Unix))!回到 1979 年的 [AT&T UNIX 32v](http://gunkies.org/wiki/32v)。干得好,先生。 (3认同)
  • 然后在像 `paste -d '\n' <(find /) <(find /)` 这样的示例中将其与进程替换一起使用,并意识到这比首先以各种方式将结果写入文件要好得多,磁盘使用、内存使用、并行化、可取消性...... (2认同)

sam*_*gak 6

这是一个解决方案awk:

awk '{print; if(getline < "file2") print}' file1
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc
Run Code Online (Sandbox Code Playgroud)

awk 如果要为输出添加一些额外的格式,则使用可能很有用,例如,如果要根据文件的来源标记每一行:

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc
Run Code Online (Sandbox Code Playgroud)

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

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

awk '{print; if(getline < "file2") print; else print ""}' file1
Run Code Online (Sandbox Code Playgroud)

要么

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


Jos*_*erg 5

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

(cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-
Run Code Online (Sandbox Code Playgroud)

请注意(我感兴趣的是)如果您使用可能比另一个运行得更慢或更快的命令的输出而不是静态文件,则需要做更多的工作才能获得正确的排序。在这种情况下,除了行号之外,您还需要添加/排序/删除另一个标签:

(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-
Run Code Online (Sandbox Code Playgroud)


Cyr*_*rus 5

使用 GNU sed:

sed 'R file2' file1
Run Code Online (Sandbox Code Playgroud)

输出:

1.1号线
线路2.1
1.2号线
第2.2行
1.3号线
2.3号线