감동, 마음이 움직이는 것
[sort] using command line and c++ function 본문
[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하면
다음과 같이 뿌려 줍니다.
이 내용을 새로운 파일에 써주려면
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; } |
'Tips (Utility, Computer Language, and etc.)' 카테고리의 다른 글
[gnuplot] how to drwo a single point (0) | 2016.09.20 |
---|---|
[gawk] float calculation for awk (0) | 2016.09.19 |
[linux] awk (0) | 2016.09.19 |
[Linux] Effectively delete a lot of files in a directory (0) | 2016.09.17 |
[Slurm] How to use (1) | 2016.09.16 |