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)
这是一个解决方案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)
@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)
使用 GNU sed:
sed 'R file2' file1
Run Code Online (Sandbox Code Playgroud)
输出:
1.1号线 线路2.1 1.2号线 第2.2行 1.3号线 2.3号线
归档时间: |
|
查看次数: |
21784 次 |
最近记录: |