큰 파일에서 두 문자열 사이를 정렬하는 것이 가능합니까?
예를 들어 현재 파일은 다음과 같습니다.
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
매크로 실행 속도를 높이고 싶을 수도 있습니다 .