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

时间:2010-10-25 03:55:38

标签: 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工具的单行代码?

5 个答案:

答案 0 :(得分:128)

paste -d '\n' file1 file2

答案 1 :(得分: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,并且您想在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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

cat file1 file2 |sort -t. -k 2.1

这里指定了分离器是“。”并且我们正在排序第二个字段的第一个字符。