파일에 숨겨진 숫자 값으로 파일의 줄을 정렬합니다.

파일에 숨겨진 숫자 값으로 파일의 줄을 정렬합니다.

USB 플래시 드라이브의 오류를 테스트하는 도구를 사용하기 위해 Bash 스크립트를 작성 중입니다 f3. 다음과 같은 텍스트가 있습니다( f3read프로그램에서 로그를 수집하여 생성됨).

2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors)
2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors)
2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors)
2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors)
2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors)
2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors)

행 끝에 표시된 불량 섹터 수를 기준으로 행을 정렬하고 싶습니다. 사용해 보았지만 옵션을 사용하여 원하는 대로 작동하게 만드는 sort방법을 모르겠습니다 .--key

보고를 위해 드라이브 이름(sda, sdb 등)을 추출해야 하기 때문에 먼저 줄을 자를 수가 없습니다.

답변1

POSIXly에서는 다음과 같이 할 수 있습니다.

sort -t '(' -k2n < file

즉, 필드 구분 기호를 설정 (하고 두 번째 필드(또는 두 번째 필드로 시작하는 줄의 일부)를 숫자로 정렬합니다.

또는 5번째 필드에 대한 기본 필드 구분 기호(공백이 아닌 항목에서 공백으로의 전환)를 유지 " (12"하고 다음을 사용할 수 있습니다.

sort -k5.3n < file

(즉, 5번째 필드 3번째 문자부터 시작하는 줄 부분을 숫자로 정렬합니다 .)

동점인 경우 전체 행의 어휘 비교인 최종 정렬 순서가 적용됩니다(연대순 순서는 여기에서 편리하게 제공됩니다).

드라이브 이름별로 관계를 정렬하려면 다음을 사용할 수 있습니다.

sort -t '(' -k2n -k1.21

(두 번째 키는 문자 21에서 시작하는 줄의 일부, 어휘 비교입니다.)

답변2

sort -V이 옵션을 사용할 수 있는 경우 사용

-V, --version 정렬

텍스트에서 (버전) 번호의 자연스러운 순서

$ <cmd> | sort -k5,5V
2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors)
2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors)
2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors)
2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors)
2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors)
2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors)
2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors)
2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors)
2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors)

답변3

나는 그것을 발견했다.

sort -n -t '(' -k2V

-n문자열의 숫자 값을 읽도록 정렬에 지시합니다.

-t '('(문자를 필드 구분 기호로 사용하도록 지시합니다 . 이 말 때문에부서)이는 앞으로도 항상 동일하며 정렬 순서에 영향을 주지 않습니다.

-k2V(두 번째 열(첫 번째 문자 뒤의 텍스트)을 사용하여 정렬할 사용자 정의 키를 정의합니다 .

답변4

약간 더 유연한 솔루션은 섹터 수를 추출하여 줄 시작 부분에 복사하고 정렬한 다음 마지막으로 중복 항목을 다시 제거합니다.

sed 's/^.*(\([0-9]\{1,\} \)sectors)$/\1&/' |
  sort -n |
  cut -d ' ' -f 2-

이 솔루션은 각 레코드의 정렬 키를 식별하는 모든 패턴과 함께 작동하므로 더욱 유연합니다.

관련 정보