감동, 마음이 움직이는 것

[sort] using command line and c++ function 본문

Tips (Utility, Computer Language, and etc.)

[sort] using command line and c++ function

Struggler J. 2016. 9. 19. 17:18

안녕하세요. 오늘은 sorting하는 법을 포스팅하겠습니다. ㅋㅋㅋ

두 가지 방법을 소개하겠습니다.

1. 첫 번째는 커맨드에서 sort명령어를 사용하는 거구요.

2. 다른 하나는 c++에서 algorithm의 sort함수를 이용한 방법입니다.


1. 커맨드에서 sort 명령어 사용하기

많은 분들이 아시겠지만 만약에 제가 test.d라는 파일이 여러 column으로 되어 있고

그 중에서 첫 번째 줄에 들어가 있는 데이터크기대로

데이터를 다시 정렬하고 싶을 때

sort test.d라 해주면 됩니다.


만약 test.d가

1 2 5

4 6 3

3 4 9

2 0 1

이라고 써져 있으면


sort test.d하면

다음과 같이 뿌려 줍니다.

3.JPG


이 내용을 새로운 파일에 써주려면

sort test.d > sorted_test.d

라고 하면 뿌려지는 내용이 sorted_test.d에 저장이 됩니다.


인터넷에 검색해 보시면 정렬기준을 첫 번째 column이 아니라 다른 column으로 바꿀 수도 있고

reverse순으로도 sorting가능합니다:)


(+) 2015.05.25

아래 보시면 댓글에도 나와있지만 -k 숫자 를 해주시면

숫자에 해당하는 열로 데이터를 정렬할 수 있고 -r을 붙여주면 reverse로도 정렬가능합니다.


그런데 sort를 글자로 취급을 해서

아래와 같은 파일에

1

10

20

101

sort를 쓰면아래와 같은 결과를 뱉어냅니다.

1

10

101

20

따라서,

sort할 때 열을 숫자로 보고 정렬하고 싶으면 -n 이라는 옵션을 넣으셔야 합니다.



또, 두가지 이상의 정렬기준을 사용하고 싶을 때에는

sort -k2,2 -k3,3

이런식으로 두개를 주면 된다.

Ref) http://computing-gems.blogspot.kr/2013/11/sort_27.html



2. c++로 코드 짜서 사용하기


설명쓰기 귀찮아서 코드 하나를 예시로 주석을 달아놓았습니다.

혹시 더 구체적으로 알고 싶으신 분은 제게 따로 말씀해주세요 ㅋㅋ.


1
2
3
4
5
6
7
8
9
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
 
//정렬하고 싶은 데이터를 한 줄(row)씩 result에 넣어줍니다.
//제 원래 데이터는 node-identity like-indegree dislike-indegree 가 있었구요.
//node를  node를 like-indegree - dislike-indegree가 큰 순서대로 정렬을 하고 싶었습니다.
//따라서 result라는 구조체에 node-idendity와 like-indegree - dislike-indegree를 입력하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
struct result
{
    int node;
    int lmh;
};
 
//sort함수에 넣어줄 함수. 여기서 어떤순서로 정렬할 것인가를 정해주게 되는데
//아래와 같은 경우는 lmh가 큰 수가 앞에 오도록 sorting됩니다
bool compare(const result &lhs, const result &rhs)
{
    if(lhs.lmh > rhs.lmh)
        return true;
    else
        return false;
}
 
int main(int argc, char **argv)
{
    printf("1\n");
    if(argc!=2)
    {
        printf("./%s year\n", argv[0]);
        return 0;
    }
 
    char fname[64];
    FILE *ifp, *ofp;
    int N = 103, year = atoi(argv[1]);
    int node, like, dislike;
    int **data = (int**)calloc(N, sizeof(int*));
    for(int i=0; i<N; i++)
    {
        data[i] = (int*)calloc(2, sizeof(int));
    }
 
//result를 넣어줄 수 있는 vector를 선언합니다.
    vector<result> v;
    result temp;
 
 //읽고 싶은 data file을 엽니다.
    sprintf(fname, "indegree0%d.txt", year);
    ifp = fopen(fname, "r");
 
    //read the data and make arr
 //데이터를 열어서 data배열에 저장하고 필요한 정보를 result형 구조체인 temp에
 //vector에 차곡차곡 넣어줍니다.
    for(int i=0;i<N;i++)
    {
        fscanf(ifp, "%d %d %d", &node, &like, &dislike);
        data[i][0]=like;
        data[i][1]=dislike;
        temp.node = node;
        temp.lmh = like-dislike;
        v.push_back(temp);
    }
 //이게 sort해주는 함수 입니다. 이걸 위해서 위에서 #include <algorithm> 해주는 겁니다
  //아래처럼 하면 vector순서가 lmh를 비교해서 sorting된 결과로 바뀌게 됩니다. 
    sort(v.begin(), v.end(), compare);
 
    //record the avaerage size of the cluster
    sprintf(fname, "re-order0%d.d", year);
    ofp = fopen(fname, "w");
    for(int i=0;i<N;i++)
    {
        node = v[i].node;
        fprintf(ofp, "%d %d %d\n", node, data[node][0], data[node][1]);
    }
    v.erase(v.begin(),v.end());
 
    fclose(ofp);
    fclose(ifp);
    return 0;
}