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;	
    			
    	}
    }
    
    星光荡开宇宙
  • 相关阅读:
    Python元组、列表、字典
    测试通过Word直接发布博文
    Python环境搭建(windows)
    hdu 4003 Find Metal Mineral 树形DP
    poj 1986 Distance Queries LCA
    poj 1470 Closest Common Ancestors LCA
    poj 1330 Nearest Common Ancestors LCA
    hdu 3046 Pleasant sheep and big big wolf 最小割
    poj 3281 Dining 最大流
    zoj 2760 How Many Shortest Path 最大流
  • 原文地址:https://www.cnblogs.com/pogbar/p/15345620.html
Copyright © 2011-2022 走看看