免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求高效点的路径提取方法 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-03-06 06:21 |显示全部楼层
本帖最后由 lrz 于 2016-03-06 09:45 编辑

有一目录结构如下 :
客户目录/客户名/年/年-月/月日/......./文件
从“月日”目录到文件之间的目录层数不确定,但一般不会超过5层。
例:
客户目录/客户1/2015/2015-03/0301/......./文件4
客户目录/客户1/2016/2016-03/0301/......./文件1
客户目录/客户1/2016/2016-03/0301/......./文件2
客户目录/客户1/2016/2016-03/0302/......./空目录
客户目录/客户1/2016/2016-03/0303/......./文件3
客户目录/客户2/2016/2016-01/0101/......./文件1
客户目录/客户2/2016/2016-01/0101/......./文件2
客户目录/客户2/2016/2016-01/0111/......./文件3
客户目录/客户3/2016/2016-01/0110/......./文件1
........
客户目录/客户N/............

cat  a.txt
客户1
客户2

现要把a.txt中的所有客户的某一天及有文件的最近两天的文件路径提取出来,储存在b.txt,空目录就不用储存了。
把日期存在day1、day2、day3中,
如:day1=2016-03-03
要求把day1及有文件的最近两天的文件路径提取出来

上例的结果要为:
cat    b.txt
客户目录/客户1/2016/2016-03/0301/......./文件1
客户目录/客户1/2016/2016-03/0301/......./文件2
客户目录/客户1/2016/2016-03/0303/......./文件3
客户目录/客户2/2016/2016-01/0111/......./文件3



day2=2016-03-01
day3=2016-01-11

文件比较多,请问有什么高效点的办法?谢谢。

日期先后搞错了,修改一下。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
发表于 2016-03-06 11:38 |显示全部楼层
  1. while read line ; do find "客户目录/$line/${day1:0:4}/${day1:0:7}/${day1:5:2}${day1:8:2}" -type f 1>>b.txt; done <a.txt
复制代码
要求把day1及有文件的最近两天的文件路径提取出来

不知道是什么意思?是不是在day1的前一天和再前一天?比如2016-03-03的前两天是2016-03-02 和2016-03-01?如果没有2016-03-02 和2016-03-01这两天的目录,是否要继续往前推?@lrz

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
发表于 2016-03-06 21:45 |显示全部楼层
感觉有点绕,楼主描述的不是很清晰

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-03-07 01:15 |显示全部楼层
本帖最后由 lrz 于 2016-03-07 01:21 编辑

回复 2# cao627


    不是2016-03-03的前两天是2016-03-02 和2016-03-01,而是最近的有文件存在的两天,只要最近一天b.txt中有一个客户有文件存在,就保留,接着再往前找一天。如果是前两就好解决了,直接用date -d "1 days ago" 就可以了。
客户目录太大了,整个硬盘大部分都是它占了,我是用smb通过网络挂到/mnt下,文件可能不断变化,而要隔一段时间就扫描一下,用while和find效率可能慢点(现在没测试环境,没试过),其实我自己想到的方法是用ls重定向生成“文件列表.txt”可是
ls -dRFo  客户目录/{$(sed 'N;s/\n/,/' a.txt)}
会报错,如用ls列出整个客户目录文件,再用grep -f  a.txt  过滤,因客户目录太大,ls时同样慢。
还有,保存最近几天的文件路径不知如何解决,求指点

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
发表于 2016-03-07 09:45 |显示全部楼层
回复 4# lrz
  1. #!/bin/sh

  2. ROOT="客户目录"

  3. day1=2016-03-03


  4. ls -R $ROOT > file1
  5. awk -vRS="" -vFS="\n" 'NF>=2{printf $1; for(i=2;i<=NF;++i)printf $i" ";print ""}' file1 > file2

  6. while read kehu
  7. do
  8.     grep "${ROOT}/${day1:0:4}/${day1:0:7}" file2 >> file3
  9. done < a.txt

  10. while read kehu
  11. do
  12.     grep -B2 "${ROOT}/${day1:0:4}/${day1:0:7}" file3 >> file4
  13. done < a.txt

  14. awk -F: '{l=split($2,s," ");for(i=1;i<=l;++i)print $1":"s[i]}' file4 > b.txt

  15. rm -f file{1..4}
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
发表于 2016-03-07 13:47 |显示全部楼层
其实我自己想到的方法是用ls重定向生成“文件列表.txt”可是
ls -dRFo  客户目录/{$(sed 'N;s/\n/,/' a.txt)}
会报错


ls 前加上  eval   命令

同时,既然你确定了一个日期 day1 就可以将目录从    客户目录/{$(sed 'N;s/\n/,/' a.txt)}    深入到  客户目录/{$(sed 'N;s/\n/,/' a.txt)}/${day1:0:4}/${day1:0:7}/${day1:5:2}${day1:8:2}  这样就直接缩小了ls  -R的范围

如果day1最近前两天,具体哪两天是不确定的,那么那么只能 用类似  day1--循环方式将每个day--后的日期 代入上面的红色部分,然后用 判断  find "客户目录/客户1/${day1:0:4}/${day1:0:7}/${day1:5:2}${day1:8:2}" -type f 是否为空 为空的话day1接续往上减。但ls没有判断文件是否存在功能的,find -type f 能直接查找文件@lrz

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-03-08 00:22 |显示全部楼层
本帖最后由 lrz 于 2016-03-08 00:29 编辑

回复 6# cao627

不用判断目录是否为空,ls -F,然后用sed直接把“/”结尾的行删掉剩下的就是文件路径了。估计会比find快很多。
请教一下,eval所起的作用是什么?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
发表于 2016-03-08 16:58 |显示全部楼层
eval所起的作用是什么?

可形象理解为:二次曝光。具体作用还是自己网上查吧。


ls -F,然后用sed直接把“/”结尾的行删掉剩下的就是文件路径了。估计会比find快很多。

一条命令和 两条命令 实现相同的功能,一条命令会快。否者那一条命令实现某功能的代码就显得的不最优了,因为它们(代码)可以用另外两条命令的实现相同功能的代码的叠加来实现。这是我个人观点。

论坛徽章:
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
发表于 2016-03-08 17:08 |显示全部楼层

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2016-03-08 23:12 |显示全部楼层
用 find 生成列表,再处理这个列表,效率应该可以吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP