C++对文本里面的大量数据进行排序(shell,c++,fopen,awk,sed)

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
    #/bin/bash  
    #对文本里面的数据进行排序  
    awk 'BEGIN{  
        RS=","  
    }  
    {print $0}  
    END{  
    }'<a | sort -n | sed '/^$/ d' | awk 'BEGIN{  
        RS="\n";ORS=","  
    }  
    {print $0}  
    END{  
    }'|sed 's/,$//g'  
      
      
      
    下面是c++版本的。  
    ----------------------------------------------------------------------  
      
    #include <iostream>  
    #include <stdio.h>  
    #include <stdlib.h>  
    using namespace std;  
      
    template<int _N>  
    class Bitset  
    {  
        public:  
        Bitset()  
        {  
                _Tidy();//调用_Tidy()函数会初始化所有位为0.  
        }  
        void Show()//显示01位.  
        {  
            for(int _I=0;_I<_N;_I++)  
            {  
                cout<<(test(_I)?'1':'0');  
            }  
        }  
        bool test(int _P)//测试该位置是否为真(1).  
        {  
            int _I = _P/32;  
            return (A[_I]>>(_P%32))&0x1;  
        }  
        void _Tidy()  
        {  
            for(int _I=0;_I<_W;_I++)  
            {  
                A[_I] = 0;    
            }  
        }  
        void set(int _P)//将_p下标设置为1.  
        {  
            int _I = _P/32;  
            A[_I] |= (0x1<<(_P%32));  
        }  
        void printf()  
        {  
            for(int _I=0;_I<_N;_I++)  
            {  
                test(_I) && (cout<<_I<<"  ");  
            }  
        }//打印排列结果.  
        private:  
      typedef long LONG;//以long的4个字节为一个单位数组.  
        enum{_Nw=(_N-1)/(sizeof(LONG)*8),  
                    _W=_Nw+1};  
        int A[_W];  
    };  
    template<int _N>  
    void deal_what(int &sum,char c,Bitset<_N> &a,FILE *&out)  
    {  
        if(c!=' ' && c!=',' && c!='\n')  
        {  
            sum=(sum*10+(c-'0'));             
            return ;      
        }  
        else{  
            a.set(sum);//将数据设置到指定位中。  
        }  
        sum = 0;  
    }  
      
    template<int _N>  
    void get_result(Bitset<_N> &a,FILE *&out)  
    {  
        int sum = 0;  
        while(1)  
        {  
            char c = fgetc(out);  
            if(c==EOF)  
            {  
                return;  
            }  
            deal_what<_N>(sum,c,a,out);  
        }  
    }  
      
    int get_value(int x,int &n)//求数字位数  
    {  
        x && (n=get_value(x/10,n)+1);  
        return n;  
    }  
      
    template<int _N>  
    void in_put(Bitset<_N> &a,FILE *&in)//往文件b里面写入结果。  
    {  
        for(int _I=0;_I<_N;_I++)  
        {  
            if(a.test(_I))   
            {  
                int _H=_I;  
                int _K = 0;  
                get_value(_H,_K);  
                int flog = _K;  
                int save=0;  
                while(1)  
                {  
                 int sum=1;  
                 for(int _J=_K;_J>0;_J--)  
                 {  
                    sum*=10;  
                 }  
                 char c = ((_H-save*sum)/(sum/10))+'0';  
                 save = _H/(sum/10);      
                 fputc(c,in) ;  
                 flog--;  
                 _K--;  
                 if(flog==0)  
                        break;  
                }  
            fputc(' ',in);  
                }  
            }  
    }  
    int main()  
    {  
        FILE *out = fopen("a","a+");  
        FILE *in = fopen("b","a+");  
      Bitset<100> a;    
        get_result(a,out);  
        in_put(a,in);  
        fclose(out);  
        fclose(in);  
    }  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:android通过http请求获得json内容

下一篇:操作Access数据库的C#封装类