如何用Unix/Linux命令将多行块按对应行合并为单块?
解决多行块对应行合并的问题
我明白你的需求了——你不是要把每个块内部的两行合并,而是要把所有块的第一行攒到一起,所有块的第二行攒到一起,对吧?之前用awk的思路没踩对点子,我给你几个实用的解决方案:
通用方案(适配任意块行数)
如果以后你的块行数可能变化(比如从2行改成3行),这个awk命令更灵活:
awk -v block_lines=2 '{ # 计算当前行属于块中的第几行(从1开始) line_pos = (NR - 1) % block_lines + 1 # 把当前行追加到对应位置的结果中,用空格分隔已有内容和新行 result[line_pos] = result[line_pos] (result[line_pos] ? " " : "") $0 } END { # 按顺序输出每一行的合并结果 for (i=1; i<=block_lines; i++) { print result[i] } }' 你的输入文件名.txt
原理说明
-v block_lines=2:通过变量指定每个块的行数,这里设为2,需要改的话直接修改这个数字即可line_pos = (NR -1) % block_lines +1:用行号NR计算当前行在块内的位置,比如第1、3、5...行都会被归为块内第1行,第2、4、6...行归为块内第2行- 数组
result用来分别存储每一行的合并内容,最后在END块里依次输出
简化方案(固定2行块)
如果你的块行数固定是2,也可以用更简洁的写法,不用额外变量:
awk '{ if (NR % 2 == 1) { # 奇数行(每个块的第1行)追加到第一列 col1 = col1 (col1 ? " " : "") $0 } else { # 偶数行(每个块的第2行)追加到第二列 col2 = col2 (col2 ? " " : "") $0 } } END { print col1 print col2 }' 你的输入文件名.txt
示例验证
比如你的输入文件内容是:
块1第1行 块1第2行 块2第1行 块2第2行 块3第1行 块3第2行
运行命令后会输出:
块1第1行 块2第1行 块3第1行 块1第2行 块2第2行 块3第2行
这样就完全符合你的需求啦~
内容的提问来源于stack exchange,提问作者Peng Yuan
相关产品推荐
相关产品推荐

