是否可以在大文件中的两个字符串之间进行排序?
例如,当前文件为:
0cf Front Brake
0d0 Rear Brake
0ce Handle Bars
HUT 03 VR Controls
009 Vest
001 Belt
002 Body Suit
020 Stereo Enable
003 Flexor
007 Hand Tracker
004 Glove
006 Head Mounted Display
008 Oculometer
00a Animatronic Device
000 Unidentified
021 Display Enable
005 Head Tracker
HUT 04 Sport Controls
000 Unidentified
002 Golf Club
001 Baseball Bat
所需的输出如下:
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
在这里,HUT 03 VR Controls和HUT 04 Sports Controls部分进行了整理。
在给定的文件中,节标题以非空格字符开头,而节内容始终以空格或制表符开头。由于此文件有 100 多个部分,因此在脚本/命令中硬编码部分名称是不可行的
在 Python 中:
这会对所有部分(单独)进行排序,而不仅仅是两个特定行之间的部分。
这用于
awk
在与该行所在的部分相对应的每一行前面添加一个数字(和一个制表符分隔符)。对于节标题,我们添加一个数字后跟一个退格字符(仅因为退格在制表符之前排序)。然后我们在删除它们和添加的制表符分隔符之前简单地对这些数字的结果数据进行排序。通过在行首查找非空白字符来检测节标题。
为了好玩,这是一种使用以下方法对单个部分进行排序的方法
ex
:你可以得到
awk
并sort
合作完成工作。sort
close
调用;sort
这会导致sort
将其输出刷新到标准输出并退出sort
接管close
以sort
处理尾随内容对于这样的任务,我经常发现编写脚本很乏味。
vim
如果只需要执行一次并且可能只需要几个文件,那么如果您打开文件并键入以下内容,则可以使用宏很好地完成:GoFAKE SECTION<ESC>
:在最后添加一个假部分,并确保它位于行首(您可能拥有cindent
或autoindent
启用)。这也是对最后一部分进行排序所必需的。gg
:返回到文件的开头,然后文件从一个部分开始向下一行j
qq
: 开始录制宏来注册 qv
: 开始选择/^\S\+<Enter>
: 搜索下一节的开头k
: 上一行:!sort<Enter
: 对部分进行排序nj
: 转到下一节的第一个元素q
: 停止录制宏@q
: 重复宏100@@
:重复宏几次(直到没有剩余部分)dd
:删除文件的最后一行(FAKE SECTION
)您可能希望
:set lazyredraw
加快宏的执行速度。