sort(Linux练习)

用man sort 查看sort的帮助文档

sort常用选项和功能、sort使用

sort常用选项和功能

-t用于指定域的分隔符。单独使用时:空格:abc:空格若不指定分隔符为:则是一个域。若使用-t:指定:为分隔符则分成了3个域。
-k用于指定排序使用的域。如:sort -t: -k3 test.txt就使用第三个域(数字)进行排列,但要注意这时仍然使用的是字符串比较进行的排序。如下图:
-n用于表示使用数值大小进行排序,如同上图时,若加入-n,就会按照数的大小排序。
-r结果逆向显示,从大到小。
-u去掉重复行后再进行排序。
-o将结果存到文件中。
-c代表测试这个文件是否已经排序。如果是按照给定参数有序的,就无输出,否则输出第一条不符合排序的记录。

sort使用截图

测试文档是微信读书上一些电脑和品牌型号的一个文档:
test.txt:

ThinkPad:USA:14000:2009:X301
ThinkPad:HongKong:10000:2008:T400
ThinkPad:USA:8000:2007:X60
HP:China:5600:2010:DM3
HP:China:12000:2010:NE808
SumSung:Korea:5400:2009:Q308
IdeaPad:China:8000:2007:U450
Acer:Taiwan:8000:2010:PT210

sort -t: -k3 test.txt:为分隔,以第三个域为标准,字符串方式排序:

sort -t: -k3 -n test.txt:为分隔,以第三个域为标准,数值大小方式排序:

sort -t: -k3 -n -r test.txt:为分隔,以第三个域为标准,数值大小方式反序排序:

sort -t: -k3 -n -r test.txt -o result.txt:为分隔,以第三个域为标准,数值大小方式反序排序并将结果存在result.txt中:

测试文件是否按照以上规则有序:

实现sort的方法和过程

1.尝试寻找可以使用的系统调用或C库函数

终端输入man -k sort | grep 2man -k sort | grep 3

从图中可以看到,C语言函数库中的qsortqsort_r就很可能可以实现我们的功能,可以直接用。

2.进一步了解qsortqsort_r

使用man qsort查看qsort功能和用法。

通过阅读qsort的manual信息,我们了解到qsort可以进行快速排序。需要传入的参数有待排数组、待排序的单位大小、单位个数、排序的比较函数的函数指针。

3.编写伪代码实现

利用刚刚用man学到的知识和以前的C语言、文件读写知识,用以下代码实现了mysort。

#include <stdio.h>
#include <stdlib.h>

int values[128];

int compare(const void * a, const void * b)
{
    return (*(int *)a - *(int *)b);
}

int main(int argc, char* argv[])
{
    int i,k;
    FILE* fp;
    if(argc!=2){
    	printf("参数错误,请传入一个文件名。\n");
    	return -1;
    }
    fp=fopen(argv[1],"r");
    if(fp==NULL){
    	printf("无法打开文件!\n");
    	return -1;
    }
    for(k=0;k<128;k++){
    	if(fscanf(fp,"%d",&values[k])==0)
    	    break;
    	if(values[k]==0)
    	    break;
    }
    qsort(values,k, sizeof(int), compare);
    for (i = 0; i < k; i++){
        printf("%d ", values[i]);
    }
    putchar('\n');
    return 0;
}

代码对一行文件进行数值排序,以0为结束符。


整体使用课上的学习方法进行了完成,总体对结合man的linux的学习方法有一定收获。

4.运行截图:

代码链接

https://gitee.com/Ressurection20191320/code/tree/master/IS/mysort

posted @ 2021-09-27 21:48  20191320  阅读(128)  评论(0编辑  收藏  举报