免费注册 查看新帖 |

Chinaunix

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

[文本处理] 【已解决】用tr解决了……没想到涉及到的知识点不少 [复制链接]

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

现有url.txt,每行一个网址,通过curl获取源代码,判断源代码中是否包含A或者B,包含则输出改行,不包含则输出字符串“无内容”。

由于始终会有一些url的源代码中不包含A或B,但是必须保证url和输出内容成一一对应关系,否则会由于某些行没有内容,而导致不能一一对应,不利于排查有问题的url。

现有几种思路:

(1)最开始,是直接for i in `cat url.txt`;do curl "$a"|awk '$0~/A/||$0~/B/ {print $0}'|sed 略 >结果.txt
这样会由于有些url的源代码中A/B都不包含,所以这些url就没有输出内容,导致与url.txt错位,不能进一步处理到想要结果

(2)后来尝试awk使用if判断,结果导致else会对源代码每一行进行判断(而非整个源代码),会出现很多空行(实际只需要连续空行保留一个空行),后面使用paste -d把结果和url两个文件组合起来,得到想要结果。暂时不知道怎么处理……

(3)把变量i声明为临时环境变量,在后续管道在行首或行尾打印变量出来……但也没有找到适合这种情况的方法。

现在的脚本代码是这样的:

#!/bin/bash
#!/bin/sh
for i in `cat url.txt`
do
{
curl -s "$i"|iconv -f GB2312 -t UTF-8|awk '{$0~/哈哈哈/||$0~/啪啪啪/'|sed "s/<[^>]*>//g"
} &
done >ok.txt
wait

扒了很多文,感觉很无理(没学过编程,接触cygwin shell只有两个月时间……orz


----------------------------------------------------------------------
成功解决了一部分问题

(1)首先不能多线程跑,多线程的话顺序会乱掉……妈的智障啊www
(2)核心思想是,先处理源代码,去掉html标签,然后去掉空行和tab,然后把换行替换成tab,最后awk -F"\t"把所有数据放在一行分割成域,最后用awk if else判断行上是否包含字符串,然后打印特定的域。sed不能替换换行……要用tr -t '\n' '\t'才行。
然后,当curl因为网络遇到问题的时候……就会出问题(当没有获取到源代码的时候),这个问题还没想到怎么解决。

总之谢谢大家了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP