对文件的一部分进行排序

SHW*_*SHW 8 sort

是否可以在大文件中的两个字符串之间进行排序?

例如当前文件是:

    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 ControlsHUT 04 Sports Controls 部分被整理出来。

在给定的文件中,部分标题以非空格字符开头,而部分内容始终以空格或制表符开头。由于此文件有 100 多个部分,因此在脚本/命令中硬编码部分名称是不可行的

Ste*_*itt 7

在 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)

这对所有部分(单独)进行排序,而不仅仅是两个特定行之间的部分。


jll*_*gre 6

为了好玩,这是一种使用以下方法对单个部分进行排序的方法ex

ex file <<%
/HUT
+1,/HUT/-1!sort
w file.sorted
q
%
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 6

$ 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在与该行所在部分相对应的每一行前面添加一个数字(和一个制表符分隔符)。对于部分标题,我们添加一个数字,后跟一个退格字符(仅因为退格在制表符之前排序)。然后我们简单地对这些数字的结果数据进行排序,然后再删除它们和添加的制表符分隔符。

通过在行的开头查找非空白字符来检测节标题。