今天工作接了个任务。领导给了一堆URL,让把其中的域名整理出来。
给的文档内容如下
https://new.aol.com/productsweb/?promocode=825345&ncid=txtlnkuswebr00000106
http://www.aol.com/#
https://account.aol.com/account/settings/start
http://www.aol.com/#
http://www.aol.com/?molhp=txtlnkusaolp00000051&icid=acm50mtmhpusermenu
http://mail.aol.com/?offerId=newmail-testf-en-us
http://on.aol.com
http://www.aol.com/favorites/
http://www.aol.com/wintergamesunfiltered/
http://www.aol.com/
http://mail.aol.com/
http://weather.aol.com/
http://www.mapquest.com/
要求的结果呢就是
new.aol.com
account.aol.com
mail.aol.com
.
.
www.mapquest.com
这个样子。
当然,数据量比较大,有200多个网站的二级域名,于是就想写个小程序。
最开始想到的是最熟悉的C语言。头皮都抓破了写出下面这段代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 100
#define FILENAME "domain.txt"
#define STARTNUM 7
int main()
{
FILE *fp_source;
char arr[MAXLINE+1];
char arr2[MAXLINE+1];
FILE *fp_result;
if((fp_source = fopen (FILENAME, "r")) == NULL)
{
perror ("File source open error!\n");
exit (1);
}
if((fp_result = fopen ("result", "r+")) == NULL)
{
perror ("File result open error!\n");
exit (1);
}
printf("start fgets\n");
while((fgets(arr, MAXLINE, fp_source)) != NULL)
{
int i=STARTNUM;
int j=0;
while(arr[i]!= '/' && arr[i]!=32 && arr[i]!=10 && arr[i]!=13) //32 10 13为 空格回车制表件ASSCI值
{
arr2[j]=arr[i];
i++;
j++;
}
arr2[j]='\0';
arr2[j+1]='\n';
printf("end char copu\n");
int flag=0;
fseek(fp_result,0,SEEK_SET);
while((fgets(arr, MAXLINE, fp_result)) != NULL)
{
printf(" arr[]=");
puts(arr);
printf(" arr2[]=");
puts(arr2);
printf("\n");
if(strcmp(arr,arr2)==0)
flag=1;
printf("flag=%d \n",flag);
}
printf("end strcmp\n");
if(flag == 0)
{
fseek(fp_result,0,SEEK_END);
fputs (arr2,fp_result);
fputc ('\n',fp_result);
}
// fputs (arr, stdout);
}
fclose(fp_result);
fclose(fp_source);
return 0;
}
悲剧的是程序还不能用。 在字符串比较那块儿出的问题,flag一直是0. 好心人顺便给看看是怎么个情况吧 。
经高人指点,用一行linux命令解决了问题 命令如下
cat *|awk -F[\/] '{print $3}'|sort -u >>gwdns
分开解释下
awk -F [\/] //awk默认字段分隔符为空格,用-F命令可以更改默认字段分隔符,此处将默认分隔符改为/
printf $3 //打印第三个字段 $3为awk默认变量,awk和shell类似,用1-9分别代表1到9个字段,特别的 ,0 代表整行。
sort -u //对结果进行排序并去除相邻重复行 ,可以用 sort|uniq 替换。