免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3451 | 回复: 7
打印 上一主题 下一主题

[文本处理] 求教一下统计目录下所有文件中符合条件的行数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-26 15:03 |只看该作者 |倒序浏览
本帖最后由 响亮的名字 于 2016-01-27 09:06 编辑

现有一个文件夹,里面大约20000个文件,每个文件中都有N行数据,现在需要统计每个文件下包含某特定字符串(如【啊啊啊】)的行数,最终汇出到一个文件
文件格式为:
文件名  行数
1.txt    20


for循环和while read line用得还不是很熟(没有编程基础),shell是为了处理网站日志现学现卖的

我暂时是这样做的


cd F:/txt/
ls >../list.txt
#list.txt里面会有乱码……不知道为什么,于是只好手动把乱码的东西替换掉。
cat ../list.txt|while read line
do
cat $line|grep -a '啊啊啊'|wc -l|sed "s/^/$line  /g"
done
>../ok.txt

试了很多次才不报错……但是我有些地方不太明白
(1)为什么ls导出文件会有乱码呢?而ls直接在cygwin里面显示就没有。
(2)不太明白程序是怎么执行的,是先读第一行,开始DO第一次,DONE后继续读第二行……知道都读完了,再写入到文件里吗?
是否可以没读一行都以>>的方式写入到文件里呢?
(3)最后发现没有得到想要的文件……虽然过程都在cygwin命令行里面显示出来了,但是没有存入到文件里,求教

我是个小白,真心求教导T^T


后来一个朋友告诉我这个
cd 目录
awk '{if($0~/啊啊啊/)print FILENAME}' *.log|uniq -c
打开所有文件,通过if语句判断是否一行($0)同时匹配字符串【啊啊啊】,如果是则输出文件名到行……这样,会得到一个文件,每行都是文件名,通过uniq -c根据文件名的出现次数来获得各自文件中符合条件的行有多少个。
这个算法应该是比较科学的,效率应该比我那个要好多了,捂脸逃

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2016-01-26 15:20 |只看该作者
  1. for i in `ls -1`
  2. do
  3.     grep -cH '啊啊啊' && sed 's/:/ /' > file.txt
  4. done
复制代码
  1. awk 'a!=FILENAME{if(a && n)print a,n>"file.txt";a=FILENAME;n=0}/啊啊啊/{++n}' *
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
Windows19 + 5

查看全部评分

论坛徽章:
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
3 [报告]
发表于 2016-01-26 15:24 |只看该作者
回复 1# 响亮的名字

1. find the key word "xxx"
$ grep -c xxx *
1.txt:3
16G.txt:10
bbb.txt:0
...
x.log:5
xx:0

2. remove without matched
$ grep -c xxx * | grep -v :0
1.txt:3
16G.txt:10
...
x.log:5

3. change ":" to tab "\t"
$ grep -c xxx * | grep -v :0 | sed 's/:/\t/'
1.txt        3
16G.txt        10
...
x.log        5

Note: column -t for good format

评分

参与人数 1信誉积分 +5 收起 理由
Windows19 + 5

查看全部评分

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
4 [报告]
发表于 2016-01-26 15:31 |只看该作者
回复 1# 响亮的名字
  1. awk 'BEGIN{f="/tmp/sum.txt";print "文件名\t行数" > f}c&&d!=FILENAME{print d"\t"c > f;c=0}/xxx/{d=FILENAME;c++}END{print d"\t"c > f}' *.txt
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
Windows19 + 5

查看全部评分

论坛徽章:
12
程序设计版块每日发帖之星
日期:2016-01-28 06:20:00程序设计版块每周发帖之星
日期:2016-03-07 16:29:28程序设计版块每日发帖之星
日期:2016-02-04 06:20:00程序设计版块每日发帖之星
日期:2016-02-02 06:20:00每周论坛发贴之星
日期:2016-01-31 22:22:00程序设计版块每日发帖之星
日期:2016-02-01 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00每日论坛发贴之星
日期:2016-01-30 06:20:00程序设计版块每日发帖之星
日期:2016-01-30 06:20:00每日论坛发贴之星
日期:2016-01-29 06:20:00程序设计版块每日发帖之星
日期:2016-01-29 06:20:0015-16赛季CBA联赛之福建
日期:2016-04-06 14:19:05
5 [报告]
发表于 2016-01-26 15:40 |只看该作者
1. 是不是文件名中有中文呢   因为windows的文件名中文编码默认为 GBK,而Linux中默认文件名编码为UTF8,而cygwin是unix系统所以都是utf8的
2.你是把ls得到的结果保存到list.txt  然后用while 循环 相当于每一次都cat一个文件吧  你说cat的第一行是读取ls的第一个文件  cat第一个文件就是读取第一个文件的全部内容了  然后再grep筛选出 “啊啊啊” wc -l统计行数
是全部读完了再写入文件  因为你的 >../ok.txt摆在外面了
3.没存到文件时因为。。。。。你每次cat完就要放进去ok.txt里面。。。

cat ../list.txt|while read line
do
cat $line|grep -a '啊啊啊'|wc -l|sed "s/^/$line  /g"  >> ../ok.txt
done
这样行不?

评分

参与人数 1信誉积分 +5 收起 理由
Windows19 + 5

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2016-01-26 15:48 |只看该作者
本帖最后由 响亮的名字 于 2016-01-26 15:52 编辑

回复 5# ydzcjj


路径的确是有中文,ls我单独处理了下,存入了list文件。
我后来自己重新写了下,发现搞定了,就是效率有点低

cd f:/hhhh
cat ../list.txt|while read line;do cat "$line"|grep '啊啊啊'|wc -l|sed "s/^/$line  /g";done >../ok.txt

论坛徽章:
12
程序设计版块每日发帖之星
日期:2016-01-28 06:20:00程序设计版块每周发帖之星
日期:2016-03-07 16:29:28程序设计版块每日发帖之星
日期:2016-02-04 06:20:00程序设计版块每日发帖之星
日期:2016-02-02 06:20:00每周论坛发贴之星
日期:2016-01-31 22:22:00程序设计版块每日发帖之星
日期:2016-02-01 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00每日论坛发贴之星
日期:2016-01-30 06:20:00程序设计版块每日发帖之星
日期:2016-01-30 06:20:00每日论坛发贴之星
日期:2016-01-29 06:20:00程序设计版块每日发帖之星
日期:2016-01-29 06:20:0015-16赛季CBA联赛之福建
日期:2016-04-06 14:19:05
7 [报告]
发表于 2016-01-26 15:58 |只看该作者
回复 6# 响亮的名字


    应该是要 >> ../ok.txt 吧   用这个>会把之前的记录都删掉的  只会留下最后一次筛选的结果

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
8 [报告]
发表于 2016-01-26 16:20 |只看该作者
各位大大  过来帮我看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP