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

Linux 如何交错两个文本文件中的行,linux,unix,command,Linux,Unix,Command,交错两个(或更多)文本文件行的最简单/最快方法是什么?例如: 文件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工具的一行程序就可以解决问题 paste -d '\n' file1 file2 这里指定了分隔

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

文件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工具的一行程序就可以解决问题

paste -d '\n' file1 file2
这里指定了分隔符为“”,我们根据第二个字段的第一个字符进行排序


这里指定分隔符为“.”,我们根据第二个字段的第一个字符进行排序。

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

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

下面是一个使用
awk
的解决方案:

awk '{print; if(getline < "file2") print}' file1
如果您想在输出中添加一些额外的格式,例如,如果您想根据每一行来自哪个文件来标记每一行,则使用
awk
非常有用:

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1
注意:此代码假定file1的长度大于或等于file2

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

awk '{print; if(getline < "file2") print; else print ""}' file1
awk'{print;if(getline<“file2”)打印;else打印“}”文件1

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

这里有一个使用
awk
的解决方案:

awk '{print; if(getline < "file2") print}' file1
如果您想在输出中添加一些额外的格式,例如,如果您想根据每一行来自哪个文件来标记每一行,则使用
awk
非常有用:

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1
注意:此代码假定file1的长度大于或等于file2

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

awk '{print; if(getline < "file2") print; else print ""}' file1
awk'{print;if(getline<“file2”)打印;else打印“}”文件1

awk'{print“1:$0;if(getline<“file2”)print“2:$0;else print“2:”}file1
指出了一个有用的方向。您可以添加行号、对行号进行排序和剥离:

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

(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-
(cat-n指向一个有用的方向。您可以添加行号、对行号进行排序和剥离:

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

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

(cat-n我不明白这是怎么回事。例如,排序输入中没有冒号?你能解释更多吗?我的错,将“:”改为“.”它只是分隔符,如果没有指定,排序使用空格分隔字段。
man sort
了解更多信息。这个答案假设输入实际上采用问题中描述的文字形式。I我想这应该是说明性的。这样转换每个输入文件是可能的,但通过数据传递的次数会更多。codaddict的答案更好。@Novelocrat:是的,这只是另一种方式:)我不明白这是怎么回事。例如,排序输入中没有冒号?你能解释更多吗?我的错,将“:”改为“.”它只是一个分隔符,如果没有指定,排序使用空格分隔字段。
man sort
了解更多信息。这个答案假设输入实际上采用问题中描述的文字形式。我认为at应该是说明性的。以这种方式转换每个输入文件是可能的,但通过数据传递的次数会更多。codaddict的答案更好。@Novelocrat:是的,这只是另一种方式:)注意:在某些平台上,
paste
相当有限-例如,在Solaris上,您最多可以有12个输入文件,输出行限制为511个字符。然后将此与进程替换一起使用,例如
paste-d'\N'Wow!追溯到1979年。做得好,先生。注意:在某些平台上,
paste
是相当有限-例如,在Solaris上,您最多可以有12个输入文件,输出行限制为511个字符。然后将此与进程替换一起使用,例如
paste-d'\n'Wow,!追溯到1979年。做得好,先生。