sort는 기본적으로 하나의 seperator를 기준으로 파싱한다. 

따라서 여러 seperator가 있는데, 다르게 sort하고 싶다면, 좀 꽁수를 써야한다.


"숫자:숫자:show\t개수" 형태의 로그를 분석할텐데, 첫 번째 숫자와 \t 뒤의 개수로 정렬하려고 한다.


예제


$ cat test

1:10151575:show 1

1:11791136:show 3

1:12589310:show 2

1:15509090:show 1

2:16981178:show 1

2:17484153:show 1

1:17948015:show 3

3:19560507:show 1

3:19670147:show 1

1:20954348:show 5

4:21565714:show 1

1:2222999:show 7

1:22429745:show 2

1:2343166:show 1

1:24317738:show 1

4:26015409:show 1

5:26972412:show 1

6:27028699:show 1

1:27647386:show 3

1:28222001:show 2

1:29852663:show 1

1:31338708:show 8





tr로 '\t'를 ':'로 맞춘 후, sort 명령을 사용하면 된다.


 $ cat test | tr '\t' ':' | sort -t ':' -k1,1 -k4,4r

1:31338708:show:8

1:2222999:show:7

1:20954348:show:5

1:11791136:show:3

1:17948015:show:3

1:27647386:show:3

1:12589310:show:2

1:22429745:show:2

1:28222001:show:2

1:10151575:show:1

1:15509090:show:1

1:2343166:show:1

1:24317738:show:1

1:29852663:show:1

2:16981178:show:1

2:17484153:show:1

3:19560507:show:1

3:19670147:show:1

4:21565714:show:1

4:26015409:show:1

5:26972412:show:1

6:27028699:show:1



그러나, 예시는 한 자리 수라 문제가 없다. 만약 2자리 수라면 숫자 정렬에 이슈가 생긴다.


$ cat  > test

1:10151575:show 95

1:11791136:show 948

1:12589310:show 2

1:15509090:show 1

2:16981178:show 1

2:17484153:show 1

1:17948015:show 3

3:19560507:show 1

3:19670147:show 1

1:20954348:show 5

4:21565714:show 1

1:2222999:show 7

1:22429745:show 2

1:2343166:show 1

1:24317738:show 1

4:26015409:show 1

5:26972412:show 1

6:27028699:show 1

1:27647386:show 3

1:28222001:show 2

1:29852663:show 1

1:31338708:show 8



아까와 같은 방식으로 하면 문제가 발생한다. 문자로 인식하면서 발생한 것인데, 95가 948보다 크게 잡힌다. 


$ cat test | tr '\t' ':' | sort -t ':' -k1,1 -k4,4r

1:10151575:show:95

1:11791136:show:948

1:31338708:show:8

1:2222999:show:7

1:20954348:show:5

1:17948015:show:3

1:27647386:show:3

1:12589310:show:2

1:22429745:show:2

1:28222001:show:2

1:15509090:show:1

1:2343166:show:1

1:24317738:show:1

1:29852663:show:1

2:16981178:show:1

2:17484153:show:1

3:19560507:show:1

3:19670147:show:1

4:21565714:show:1

4:26015409:show:1

5:26972412:show:1

6:27028699:show:1



numberic value로 여기는 -n 옵션을 추가해야 숫자로 판단하고 의도한 정렬을 볼 수 있다.


$ cat test | tr '\t' ':' | sort -t ':' -k1,1 -k4,4rn

1:11791136:show:948

1:10151575:show:95

1:31338708:show:8

1:2222999:show:7

1:20954348:show:5

1:17948015:show:3

1:27647386:show:3

1:12589310:show:2

1:22429745:show:2

1:28222001:show:2

1:15509090:show:1

1:2343166:show:1

1:24317738:show:1

1:29852663:show:1

2:16981178:show:1

2:17484153:show:1

3:19560507:show:1

3:19670147:show:1

4:21565714:show:1

4:26015409:show:1

5:26972412:show:1

6:27028699:show:1





Posted by '김용환'
,