交错两个(或更多)文本文件的行的最简单/最快的方法是什么?例:
文件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:
paste -d '\n' file1 file2
paste -d '\n' <(find /) <(find /)
并意识到这比首先以各种方式(磁盘使用,内存使用,并行化,可取消性)将结果写入文件的方式要好得多
paste
!追溯到1979年的AT&T UNIX 32v。干得好,先生。
这是使用的解决方案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
@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-
cat file1 file2 |sort -t. -k 2.1
在此指定分隔符为“。” 并且我们正在对第二个字段的第一个字符进行排序。
man sort
有关更多信息。
paste
相当有限-例如,在Solaris上,您最多可以有12个输入文件,而输出行则限制为511个字符。