免费注册 查看新帖 |

Chinaunix

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

[文本处理] 小弟扛不住,这个shell太有挑战性,请高手帮忙看看 [复制链接]

论坛徽章:
0
发表于 2017-07-26 13:32 |显示全部楼层

Channel:3D试验
Date:20170726
0000-0140|劲爆体育
0140-0320|全天节目结束
0320-0500|全天节目结束
0500-0640|全天节目结束
0640-0820|全天节目结束
0820-1000|全天节目结束
1000-1030|全天节目结束
1030-1041|糖果总动员(19)
1041-1130|城市之光Ⅲ(下)
1130-1200|3D乐园
1200-2400|万家灯火
Channel:北京卫视
Date:20170726
0000-0012|我的前半生剧宣
0012-0016|广宣时段
0016-0118|光阴
0118-0121|广宣时段
0121-0221|我的前半生剧宣
0221-0224|广宣时段
0224-0310|幸福请你等等我(11)
0310-0356|幸福请你等等我(12)
0356-0442|幸福请你等等我(13)
0442-0542|养生堂
0542-0601|法治进行时
0601-0620|法治进行时
0620-0657|养生堂精编版
0657-0700|广宣时段
0700-0840|北京您早
0840-0900|北京您早
0900-0905|广宣时段
0905-0930|精品栏目荟萃
0930-1015|甄环传(6)
1015-1020|广宣时段
1020-2400|甄环传(7)
Channel:北京卫视HD
Date:20170726
0000-0012|我的前半生剧宣
0012-0016|广宣时段
0016-0118|光阴
0118-0121|广宣时段
0121-0221|我的前半生剧宣
0221-0224|广宣时段
0224-0310|幸福请你等等我(11)
0310-0356|幸福请你等等我(12)
0356-0442|幸福请你等等我(13)
0442-0542|养生堂
0542-2400|法治进行时
Channel:卡酷卡通
Date:20170726
0000-0005|猫和老鼠之飞向火星
0005-0027|西游记(2
0027-0049|西游记(29)
0049-0119|西游记(30)
0119-0141|西游记(31)
0141-0203|西游记(32)
0203-0230|百变马丁(41)
0230-0252|百变马丁(42)
0252-0314|百变马丁(43)
0314-0341|百变马丁(44)
0341-0403|猪猪侠之五灵守卫者(19)
0403-0425|猪猪侠之五灵守卫者(20)
0425-0439|大耳朵图图Ⅳ(7)
0439-0454|大耳朵图图Ⅳ(
0454-0505|大耳朵图图Ⅳ(9)
0505-0516|大耳朵图图Ⅳ(10)
0516-2400|大耳朵图图Ⅳ(11)
Channel:CCTV-1
Date:20170726
0000-0118|挑战不可能(62)
0118-0124|生活提示
0124-0156|晚间新闻
0156-0241|动物世界
0241-2400|精彩1刻:湛江人龙舞

....
....


小弟有一个文本文件,内容大致如上,现在想将该文本文件中每一个带卫视的channel ,该channel包含的节目单内容抽取,重定向到新文件,比如抽取北京卫视的channel,该文件被重命名为北京卫视.txt,该文件的内容包含如下,时间段从000开始,   2400结束
Channel:北京卫视
Date:20170726
0000-0012|我的前半生剧宣
0012-0016|广宣时段
0016-0118|光阴
0118-0121|广宣时段
0121-0221|我的前半生剧宣
0221-0224|广宣时段
0224-0310|幸福请你等等我(11)
0310-0356|幸福请你等等我(12)
0356-0442|幸福请你等等我(13)
0442-0542|养生堂
0542-2400|法治进行时


不抽取北京卫视HD、只抽取带卫视的



论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2017-07-26 14:35 |显示全部楼层
你那标红的结果的明明是 北京卫视HD 的? 又说不抽取北京卫视HD、只抽取带卫视的, 那么, 你到底闹哪样?..

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2017-07-26 14:36 |显示全部楼层
awk -vRS='Channel:' '$1~/卫视$/{print RT$0 >$1".txt"}'  urfile

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2017-07-26 14:41 |显示全部楼层
猜一下:

  1. awk -F: '$2~/卫视$/{f=$2;p=1}p{print > f".txt"}/2400/{p=0}' textfile
复制代码

论坛徽章:
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
发表于 2017-07-26 14:56 |显示全部楼层
回复 1# byrand1984

Do you like it

$ awk -F: -vk="北京卫视" '/Channel/{f=$2==k?1:0}f{print > k".txt"}' FILE

$ cat 北京卫视.txt
Channel:北京卫视
Date:20170726
0000-0012|我的前半生剧宣
0012-0016|广宣时段
0016-0118|光阴
...
1020-2400|甄环传(7)

论坛徽章:
0
发表于 2017-07-26 15:50 |显示全部楼层
在  http://bbs.chinaunix.net/thread-4263954-2-1.html  这贴中我写道:
此函数代码结构很简单,尽解所有  【掐头,去尾,过滤中间】的情况  测试通过。
-----------------
  1. #正则,三目,才是装逼绕脑袋。这些统统被我称之为,茴香豆,幺蛾子。
  2. #而我是,反正则,猪能懂,傻子能改,派的。代码是很简单的。那么,不能光说不练,请看代码:
  3. $文件存入大字符串 = Get-Content -LiteralPath 'a:\pscode\0\掐头去尾取中间\20170726.txt' -raw
  4. $已经找到了匹配头 = $false
  5. $从偏移量开始 = 0
  6. $匹配头字符串 = "Channel:北京卫视`r`n"
  7. $匹配尾字符串 = 'Channel:'
  8. #$匹配身字符串 = 'ccc'

  9. do
  10. {
  11.         if ($已经找到了匹配头 -eq $false)
  12.         {
  13.                 $tmp匹配头位置 = $文件存入大字符串.IndexOf($匹配头字符串,$从偏移量开始)
  14.                 if ($tmp匹配头位置 -eq -1)
  15.                 {
  16.                         Write-Host '找不到头了'
  17.                         exit 1
  18.                 }
  19.                 else
  20.                 {
  21.                         $匹配头位置 = $tmp匹配头位置
  22.                         $已经找到了匹配头 = $true
  23.                         $从偏移量开始 = $匹配头位置 + 1
  24.                 }
  25.         }
  26.         else
  27.         {
  28.                 $tmp匹配尾位置 = $文件存入大字符串.IndexOf($匹配尾字符串,$从偏移量开始)
  29.                 if ($tmp匹配尾位置 -eq -1)
  30.                 {
  31.                         Write-Host '找不到尾了'
  32.                         exit 2
  33.                 }
  34.                 else
  35.                 {
  36.                         $匹配尾位置 = $tmp匹配尾位置
  37.                         [string]$匹配出的字符串 = $文件存入大字符串.Substring($匹配头位置,($匹配尾位置 - $匹配头位置))
  38.                         #                        if (  $匹配出的字符串.Contains($匹配身字符串)  ) #区分大小写
  39.                         #                        {
  40.                         Write-Host $匹配出的字符串
  41.                         #                        }
  42.                         $已经找到了匹配头 = $false
  43.                         $从偏移量开始 = $匹配尾位置 + 1
  44.                 }
  45.         }
  46. }
  47. while ($从偏移量开始 -lt $文件存入大字符串.Length)
  48. Write-Host '结束'
复制代码


输出:
Channel:北京卫视
Date:20170726
0000-0012|我的前半生剧宣
0012-0016|广宣时段
0016-0118|光阴
0118-0121|广宣时段
0121-0221|我的前半生剧宣
0221-0224|广宣时段
0224-0310|幸福请你等等我(11)
0310-0356|幸福请你等等我(12)
0356-0442|幸福请你等等我(13)
0442-0542|养生堂
0542-0601|法治进行时
0601-0620|法治进行时
0620-0657|养生堂精编版
0657-0700|广宣时段
0700-0840|北京您早
0840-0900|北京您早
0900-0905|广宣时段
0905-0930|精品栏目荟萃
0930-1015|甄环传(6)
1015-1020|广宣时段
1020-2400|甄环传(7)

找不到头了


论坛徽章:
0
发表于 2017-07-26 17:37 |显示全部楼层
回复 2# reyleon

因为这个文本文件有很多频道,比如北京卫视、北京卫视HD、3D试验、女性时尚、游戏风云、黑龙江卫视 等等。。而目前只想抽取频道名称以卫视结束的,
北京卫视HD是不需要的,即使它包含了卫视两个字,3D试验、女性时尚、游戏风云这些频道也是不需要的
换句话说只要带HD的都不需要,即使有包含卫视两个字


论坛徽章:
0
发表于 2017-07-26 17:44 |显示全部楼层
小弟刚上传了一个文本文件的内容,烦请楼上的众高手再帮忙小弟分析下。

0203.rar

40.88 KB, 下载次数: 34

这是文本文件的内容

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-27 10:58 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use Encode qw(encode);

  6. local $/ = "\nChannel:";
  7. while(<>){
  8.         chomp;
  9.         my ($k, $v) = split(/\n/, $_, 2);
  10.         next unless($k =~ /卫视\z/);
  11.         open(my $FHw, '>', sprintf("%s.txt", encode('gb2312', $k)));
  12.         print $FHw encode('gb2312', join("\n", "Channel:$k", $v, ''));
  13.         close($FHw);
  14. }
复制代码

perl abc.pl urFile.txt

论坛徽章:
8
CU十四周年纪念徽章
日期:2017-08-28 17:16:1915-16赛季CBA联赛之北控
日期:2018-03-29 11:39:0615-16赛季CBA联赛之上海
日期:2018-05-21 10:46:10技术图书徽章
日期:2018-09-03 13:54:18技术图书徽章
日期:2018-09-03 13:54:2815-16赛季CBA联赛之四川
日期:2020-10-15 09:21:4720周年集字徽章-20	
日期:2020-10-28 13:53:0220周年集字徽章-庆
日期:2020-10-28 14:09:12
发表于 2017-07-27 11:13 |显示全部楼层
本帖最后由 龙牙地主天 于 2017-07-27 11:15 编辑

awk 'BEGIN{RS="Channel:" ; FS="\n" ; printf "Channel:"}$1~/卫视$/{print $0}' urfile
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP