zoukankan      html  css  js  c++  java
  • Sort 在 Linux

    本文讨论Linux里面的sort语句

    用man查看

    对应菜鸟驿站:

    部分语法实践:

    1. sort -k 2 stu.txt
      降序排序,以字符串逐次比较,故需要补齐个位

    2. sort -k 2 –n stu.txt
      添加-n 以整数进行比较

    -u 意味着是唯一的(unique),输出的结果是去完重的


    -r 以相反的顺序来排序

    -b 忽略每行前面开始出的空格字符


    -c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
    -C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

    Sort 伪代码

    对于排序的算法,可以参考大一下学过的快速排序
    0) 定义字符串所在列序号为CharNum,字符串长度CharSize,每遇换行则重置为0。定义结构体数组,存每一行的各个“单词“;

    1. fopen打开文件stu.txt;
    2. fread读取文件,按行读,每遇到分号[;]或者空格则将之前的字符串存入数组,并将字符串长度CharSize重置为0;字符串所在列序号+1;
      每一行按顺序存储单词到对应结构体的数组的第[列序号]位置;
    3. 检测sort功能,如-k num;-c;-C;-b;-r;-n;-o;
    4. 检测-c,-C,如是,编历判断是否有序,输出对应值;
    5. 检测-k,代表第几列为排序列;若没有默认为第一列
    6. -n:以数值大小排序
    7. 等等

    下面针对学生成绩处理进行了简单的sort函数编程(sort [文件名])

    测试结果如下:

    源代码:

    //每行输入五个值,分别对应为:学号,姓名,数学,语文,总和 
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define n 200 
    typedef struct row{
    	long number;
    	char name[50];
    	int math;
    	int chinese;
    	int sum;
    }STU;
    STU arr[n];
    
    int num(const void *a, const void *b)
    {
    	int number1=((STU *)a)->number;
    	int number2=((STU *)b)->number;
    	return number1>number2?1:-1;
    }
    int nam(const void *a, const void *b)
    {
    	char *s1=((STU *)a)->name;
    	char *s2=((STU *)b)->name;
    	return strcmp(s1,s2);
    }
    int mat(const void *a, const void *b)
    {
    	int number1=((STU *)a)->math;
    	int number2=((STU *)b)->math;
    	return number1>number2?1:-1;
    }
    int chi(const void *a, const void *b)
    {
    	int number1=((STU *)a)->chinese;
    	int number2=((STU *)b)->chinese;
    	return number1>number2?1:-1;
    }
    int rank(const void *a, const void *b)
    {
    	int number1=((STU *)a)->sum;
    	int number2=((STU *)b)->sum;
    	return number1>number2?1:-1;
    }
    
    int num0(const void *a, const void *b)
    {
    	int number1=((STU *)a)->number;
    	int number2=((STU *)b)->number;
    	return number1<number2?1:-1;
    }
    int nam0(const void *a, const void *b)
    {
    	char *s1=((STU *)a)->name;
    	char *s2=((STU *)b)->name;
    	return strcmp(s2,s1);
    }
    int mat0(const void *a, const void *b)
    {
    	int number1=((STU *)a)->math;
    	int number2=((STU *)b)->math;
    	return number1<number2?1:-1;
    }
    int chi0(const void *a, const void *b)
    {
    	int number1=((STU *)a)->chinese;
    	int number2=((STU *)b)->chinese;
    	return number1<number2?1:-1;
    }
    int rank0(const void *a, const void *b)
    {
    	int number1=((STU *)a)->sum;
    	int number2=((STU *)b)->sum;
    	return number1<number2?1:-1;
    }
    
    int main(int argc,char *argv[]){
    	FILE *fp;
    	char testfile[100];
    	scanf("%s",testfile);
    	if((fp=fopen(testfile,"r"))==NULL)
    	{
    		printf("fail to open the file!");
    		return 0;
    	}
    	
    	int i=0,j=0;
    	while(fscanf(fp,"%ld %s %d %d %d",&arr[i].number,arr[i].name,&arr[i].math,&arr[i].chinese,&arr[i].sum)!=EOF)
    	{
    		i++;
    	}
    	printf("choose the line that you want to sort?
    ");
    	int c;
    	scanf("%d",&c);
    	printf(" ascend(press 1) or descend(press 0)?
    ");
    	int q;
    	scanf("%d", &q);
    	
    	if(q==1){
    	
    	if(c==1) 
    		qsort(arr,i,sizeof(struct row),num);
    	else if(c==2)
    		qsort(arr,i,sizeof(struct row),nam);
    	else if(c==3)
    		qsort(arr,i,sizeof(struct row),mat);
    	else if(c==4)
    		qsort(arr,i,sizeof(struct row),chi);
    	else if(c==5)
    		qsort(arr,i,sizeof(struct row),rank);
    	else	
    		return -1;
    	for( j=0;j<i;j++)
    		printf("%ld %s %d %d %d
    ",arr[j].number,arr[j].name,arr[j].math,arr[j].chinese,arr[j].sum);
    		return 0;
    	}	
    	
    	if(q==0){
    
    	if(c==1) 
    		qsort(arr,i,sizeof(struct row),num0);
    	else if(c==2)
    		qsort(arr,i,sizeof(struct row),nam0);
    	else if(c==3)
    		qsort(arr,i,sizeof(struct row),mat0);
    	else if(c==4)
    		qsort(arr,i,sizeof(struct row),chi0);
    	else if(c==5)
    		qsort(arr,i,sizeof(struct row),rank0);
    	else	
    		return -1;
    	for( j=0;j<i;j++)
    		printf("%ld %s %d %d %d
    ",arr[j].number,arr[j].name,arr[j].math,arr[j].chinese,arr[j].sum);	
    	return 0;	
    			
    	}
    }
    
    星光荡开宇宙
  • 相关阅读:
    常用SQL Server数据修复命令DBCC一览(转载)
    多线程编程的注意事项
    [转载]Openlayers中使用TileCache加载预切割图片作为基础地图图层
    一个关于工具条可以移动和在四周停留的测试
    SQL Server同名表的判断
    SQL Server 中调整自增字段的当前初始值
    IIS and ASP.NET: The Application Pool
    Server.MapPath(path)
    自动化selenium 鼠标键盘操作& 按键用法
    多层窗口定位&多层框架定位
  • 原文地址:https://www.cnblogs.com/pogbar/p/15345620.html
Copyright © 2011-2022 走看看