如何将连续行的部分内容转换为另一部分连续行的列?
如何将文件中后半部分行与前半部分行配对成并列格式?
我有一个文件内容如下:
秩函数 原子排列 纯集合论与ZF公理系统 3.5 3.6 3.7
想要把最后三行和前三行一一对应,拼成同一行的两列,最终结果如下:
3.5 秩函数 3.6 原子排列 3.7 纯集合论与ZF公理系统
但文件的行数是不固定的(只要前后两半行数相等),我不确定正则表达式是不是可行的方案,有没有可靠的通用方法?
当然可以搞定!其实不用正则也能轻松解决,用命令行工具比如awk就特别适合这种行数对称的场景,而且不管行数是多少(只要前后两半数量一致)都能通用。
方法一:用awk实现通用处理
核心思路是先把前半部分的行存进数组,等读到后半部分时,把当前行和对应位置的前半行拼接输出。
假设你的文件名叫input.txt,直接运行这条命令就行:
awk -v total=$(wc -l < input.txt) '{if (NR <= total/2) arr[NR]=$0; else print $0, arr[NR - total/2]}' input.txt
简单解释下逻辑:
wc -l < input.txt先算出文件的总行数,通过-v total=...把这个数值传给awk的变量total- 当处理前半部分的行(行号
NR小于等于总行数的一半)时,把每一行内容存入数组arr,下标用行号标记 - 处理后半部分的行时,用当前行号减去
total/2,就能得到前半部分对应的行号,接着把当前行和数组里的对应内容拼接输出即可
方法二:编辑器正则替换(仅适合固定行数场景)
如果是在编辑器(比如VS Code、Vim)里手动处理,正则也能做到,但只适合行数固定的情况。以VS Code为例:
- 选中所有内容,打开查找替换面板,开启正则模式
- 查找模式(针对6行的情况):
^(.+)$\n^(.+)$\n^(.+)$\n^(.+)$\n^(.+)$\n^(.+)$ - 替换模式:
$4 $1\n$5 $2\n$6 $3
不过这种方法灵活性很差,行数一变就得修改正则,所以更推荐awk的方案,完全通用,不管是6行、10行还是100行,只要前后两半行数相等就能完美处理。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

