您的位置:首页 > 运维架构 > Shell

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

2015-04-29 09:27 393 查看
#/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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: