파일의 일부 정렬

파일의 일부 정렬

큰 파일에서 두 문자열 사이를 정렬하는 것이 가능합니까?

예를 들어 현재 파일은 다음과 같습니다.

    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 제어그리고HUT 04 모션 컨트롤이미 정리되었습니다.

지정된 파일에서 섹션 제목은 공백이 아닌 문자로 시작하는 반면, 섹션 내용은 항상 공백이나 탭 문자로 시작됩니다. 파일에 100개 이상의 섹션이 있으므로 스크립트/명령에서 섹션 이름을 하드코딩하는 것은 불가능합니다.

답변1

파이썬에서는:

#!/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 = "")

이렇게 하면 특정 두 줄 사이의 섹션뿐만 아니라 모든 섹션이 (개별적으로) 정렬됩니다.

답변2

$ 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

그러면 awk줄 섹션에 해당하는 각 줄 앞에 숫자(및 탭 구분 기호)가 추가됩니다. 섹션 제목에는 숫자와 백스페이스 문자를 추가합니다(백스페이스가 탭보다 먼저 정렬되기 때문입니다). 그런 다음 해당 숫자에 대한 결과 데이터를 정렬하고 해당 숫자와 추가된 탭 구분 기호를 제거합니다.

줄 시작 부분에서 공백이 아닌 문자를 찾아 섹션 제목을 감지합니다.

답변3

재미삼아 다음을 사용하여 단일 섹션을 정렬하는 방법이 있습니다 ex.

ex file <<%
/HUT
+1,/HUT/-1!sort
w file.sorted
q
%

답변4

이와 같은 작업의 경우 스크립팅이 지루하다고 생각하는 경우가 많습니다. 한 번만 수행하면 되고 몇 개의 파일에 대해서만 수행해야 하는 경우 파일을 열고 vim다음을 입력하면 됩니다.

  • GoFAKE SECTION<ESC>: 끝에 가짜 섹션을 추가하고 그것이 행의 시작 부분에 있는지 확인하십시오(있거나 활성화할 수 있음 cindent) autoindent. 이는 마지막 부분을 정렬하는 데에도 필요합니다.
  • gg: 파일의 처음으로 돌아가서 한 줄 아래의 섹션에서 파일이 시작됩니다.j
  • qq: q를 등록하기 위해 매크로 기록을 시작합니다.
  • v: 선택 시작
  • /^\S\+<Enter>: 다음 섹션의 시작 부분을 검색합니다.
  • k: 한 줄 위로 이동
  • :!sort<Enter: 부품 정렬
  • nj:다음 섹션의 첫 번째 요소로 이동
  • q: 매크로 기록 중지
  • @q: 매크로 반복
  • 100@@: 매크로를 여러 번 반복합니다(남은 부분이 없을 때까지).
  • dd: 파일의 마지막 줄 삭제( FAKE SECTION)

:set lazyredraw매크로 실행 속도를 높이고 싶을 수도 있습니다 .

관련 정보