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
'unix and linux' 카테고리의 다른 글
netstat과 watch으로 모니터링 잘하기 (0) | 2016.03.09 |
---|---|
[awk] awk에서 외부 변수 사용하기 예시 (0) | 2016.02.26 |
sort를 이용하여 여러 필드 정렬하기 (0) | 2016.02.23 |
[shell script] 특정 날짜를 기준으로 이전 며칠 날짜를 구하는 예시 (0) | 2016.02.17 |
jq - 리눅스 커맨드 라인의 json processor (0) | 2016.02.09 |