是否可以在大文件中的两个字符串之间进行排序?
例如当前文件是:
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
Run Code Online (Sandbox Code Playgroud)
所需的输出为:
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
Run Code Online (Sandbox Code Playgroud)
在这里,HUT 03 VR Controls和HUT 04 Sports Controls 部分被整理出来。
在给定的文件中,部分标题以非空格字符开头,而部分内容始终以空格或制表符开头。由于此文件有 100 多个部分,因此在脚本/命令中硬编码部分名称是不可行的
在 Python 中:
#!/usr/bin/python3
with open("file.txt", "r") as ins:
lines = []
for line in ins:
if line.startswith((" ", "\t")):
lines.append(line)
else:
lines.sort()
print(*lines, end = "", sep = "")
print(line, end = "")
lines = []
lines.sort()
print(*lines, end = "", sep = "")
Run Code Online (Sandbox Code Playgroud)
这对所有部分(单独)进行排序,而不仅仅是两个特定行之间的部分。
为了好玩,这是一种使用以下方法对单个部分进行排序的方法ex
:
ex file <<%
/HUT
+1,/HUT/-1!sort
w file.sorted
q
%
Run Code Online (Sandbox Code Playgroud)
$ awk 'BEGIN { OFS="\t"; s=0 } /^[^[:blank:]]/ { print ++s "\b", $0; next } { print s, $0 }' file | sort -n | cut -f 2-
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
Run Code Online (Sandbox Code Playgroud)
这用于awk
在与该行所在部分相对应的每一行前面添加一个数字(和一个制表符分隔符)。对于部分标题,我们添加一个数字,后跟一个退格字符(仅因为退格在制表符之前排序)。然后我们简单地对这些数字的结果数据进行排序,然后再删除它们和添加的制表符分隔符。
通过在行的开头查找非空白字符来检测节标题。