如何交错两个文本文件的行
交错两个(或更多)文本文件的行最简单/最快捷的方法是什么? 例:
文件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脚本很容易,可以打开它们并执行任务。 但是我想知道是否有可能用更less的代码逃脱,也许使用Unix工具的单线程?
paste -d '\n' file1 file2
这是一个使用awk
的解决scheme:
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完成后输出空白行,请在getlinetesting中添加else子句:
awk '{print; if(getline < "file2") print; else print ""}' file1
要么
awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1
这里有一个GUI方法:将它们粘贴到电子表格的两列中,将所有单元格复制出来,然后使用正则expression式将换行符replace为换行符。
@ Sujoy的回答指向一个有用的方向。 您可以添加行号,sorting和去除行号:
(cat -n file1 ; cat -n file2 ) | sort -n | cut -f2-
请注意(我感兴趣),如果不使用静态文件,而是使用可能运行速度较慢或比另一个更快的命令输出,则需要更多的工作来获得sorting权。 在这种情况下,除了行号外,还需要添加/sorting/删除另一个标签:
(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
这里指定分隔符是“。” 而且我们正在sorting第二个字段的第一个字符。