免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2754 | 回复: 15

[文本处理] 这个需求问了2个linux高级群,至今没有一个好的算法出现 [复制链接]

论坛徽章:
0
发表于 2015-01-29 00:11 |显示全部楼层
本帖最后由 a12333a 于 2015-01-29 00:15 编辑

需求如下:
一个文本a.txt里面包含某个网站下的文件和文件夹的绝对路径URL(百万行),文件夹没有以 / 结尾,现在要得出文件列表(无排序要求),也就是把目录过滤掉;
如:
cat a.txt
/a
/a/b/e.jpg/a/b/e
/a/b/c
/a/b/1.jpg
/a/b/c/d/e.jpg
/a/b/c/f
/a/b/c/d

其中加粗部分是被其他URL‘包含’的,当成目录需要被过滤掉;得出的结果应该是:
/a/b/e.jpg
/a/b/1.jpg
/a/b/c/d/e.jpg
/a/b/c/f
/a/b/e

注意
/a/b/e
没有被
/a/b/e.jpg’包含‘ 是2个文件;
头脑风暴,来吧~~



论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-01-29 00:42 |显示全部楼层
回复 1# a12333a

$ awk -F'/' 'FNR==NR{d="";for(n=2;n<NF;n++){d=d"/"$n;a[d]=1};next}!a[$0]' a.txt a.txt
/a/b/e.jpg
/a/b/e
/a/b/1.jpg
/a/b/c/d/e.jpg
/a/b/c/f

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
发表于 2015-01-29 08:18 |显示全部楼层
回复 1# a12333a


    没看到什么规律啊,为什么/a/b/c/d被滤掉了,而/a/b/c/f留下了?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2015-01-29 08:20 |显示全部楼层
/a/b/e.jpg/a/b/e
这一行的处理没有看明白你的需求
你怎么知道这里的 e.jpg 是文件?文件夹的名字也可以叫做 e.jpg 不是吗?

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
发表于 2015-01-29 09:05 |显示全部楼层
至今没有好答案的原因是至今需求没明确

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2015-01-29 09:39 |显示全部楼层
回复 3# goofool


    这个不是问题吧,因为 /a/b/c/d 被 /a/b/c/d/e.jpg 包含了

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
发表于 2015-01-29 09:44 |显示全部楼层
回复 6# Shell_HAT


    确实看错了

论坛徽章:
0
发表于 2015-01-29 11:19 |显示全部楼层
Shell_HAT 发表于 2015-01-29 08:20
/a/b/e.jpg/a/b/e
这一行的处理没有看明白你的需求
你怎么知道这里的 e.jpg 是文件?文件夹的名字也可以叫 ...
因为在这个文件列表中,我们没有找到/a/b/e.jpg/xxxx  可以使得/a/b/e.jpg 被判断为一个目录,所以结果要判断他是一个文件

论坛徽章:
0
发表于 2015-01-29 11:22 |显示全部楼层
dn833 发表于 2015-01-29 09:05
至今没有好答案的原因是至今需求没明确
一个文本a.txt里面包含某个网站下的文件和文件夹的绝对路径URL(百万行),文件夹没有以 / 结尾,现在要得出文件列表(无排序要求) 这个需求很明确了。
文件夹没有以 / 结尾,所以只能根据其他URL来判断当前URL是目录还是文件
比如/a/b/c 相比/ab/c/d
那么/a/b/c就一定是目录,需要过滤掉。

论坛徽章:
0
发表于 2015-01-29 11:23 |显示全部楼层
jason680 发表于 2015-01-29 00:42
回复 1# a12333a

$ awk -F'/' 'FNR==NR{d="";for(n=2;n
看这写法很牛逼,我先测试下能不能实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP