Linux教程

Sort 在 Linux

本文主要是介绍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?\n");
	int c;
	scanf("%d",&c);
	printf(" ascend(press 1) or descend(press 0)?\n");
	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\n",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\n",arr[j].number,arr[j].name,arr[j].math,arr[j].chinese,arr[j].sum);	
	return 0;	
			
	}
}
这篇关于Sort 在 Linux的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!