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 2
和man -k sort | grep 3
从图中可以看到,C语言函数库中的qsort
和qsort_r
就很可能可以实现我们的功能,可以直接用。
2.进一步了解qsort
和qsort_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.运行截图: