忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 488 | 回复: 7

[文本处理] 如何根据条件产生文件及文件内容 [复制链接]

论坛徽章:
0
发表于 2017-03-17 06:00 |显示全部楼层
本帖最后由 KEN6503 于 2017-03-17 19:32 编辑

根据下面的两个文件产生新文件和文件内容:具体如下:用文件1中的ZONE和CD在文件2中找, 如果找到, 那么就用文件2中的FILENAME 为新文件名,文件2中的filecontent 为新文件内容。如果找不到:那么,文件名就是:ZONE_CD.file, 文件内容是:DT_dat.
file1:
10 ABC YYYYMMDD
10 AAA 20170101
20 BBB 20170303


fiel2:
10 ABC SPECIALFILENAME.sh SPECIAL_CONTENT



要的文件名和内容

SPECIALFILENAME.sh SPECIAL_CONTENT
10_AAA.file 20170101_dat
20_BBB.file 20170303_dat






论坛徽章:
300
程序设计版块每周发帖之星
日期: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-03-17 09:31 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hData = ();
  5. while (<DATA>){
  6.         last if (/\A\s*\z/);
  7.         my @aT = split;
  8.         $hData{"@aT[0, 1]"} = [@aT[-2, -1]];
  9. }

  10. while (<DATA>){
  11.         my @aT = split;
  12.         my ($fn, $content) = (sprintf("%s_%s.file", @aT[0, 1]), $aT[-1] . '_dat');
  13.         if (exists ($hData{"@aT[0, 1]"})){
  14.                 ($fn, $content) = @{$hData{"@aT[0, 1]"}};
  15.         }
  16.         open (my $FHw, '>', $fn);
  17.         print $FHw $content, "\n";
  18.         close ($FHw);
  19. }

  20. __DATA__
  21. 10        ABC        SPECIALFILENAME.sh        SPECIAL_CONTENT

  22. 10        ABC        YYYYMMDD
  23. 10        AAA        20170101
  24. 20        BBB        20170303
复制代码

论坛徽章:
0
发表于 2017-03-17 10:34 |显示全部楼层
回复 2# sunzhiguolu
谢谢你的回复。能不能用shell,单位不用perl。

论坛徽章:
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
发表于 2017-03-17 10:45 |显示全部楼层
  1. awk 'NR==FNR&&FNR>=2{f[$1,$2]=$3;c[$1,$2]=$4;next}NR>FNR&&FNR>=2{if(f[$1,$2])print c[$1,$2] > f[$1,$2]; else print $3"_dat" > $1"_"$2".file"}' file2 file1
复制代码

论坛徽章:
26
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之青岛
日期:2016-11-26 17:00:4615-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:54
发表于 2017-03-17 10:52 |显示全部楼层

  1. awk 'NR==FNR{if(!/^Z/)a[$1$2]=$2 FS $3;next}/^Z/{print "filename" FS "filecontent";next}{$0=a[$1$2]?a[$1$2]:$1"_"$2".file" FS $3"_dat"}1' file2 file1|column -t
复制代码

论坛徽章:
52
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之新疆
日期:2016-03-19 12:08:3715-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:53
发表于 2017-03-17 10:56 |显示全部楼层
  1. awk 'NR==FNR{if(NR>2&&NF)s=s $1"_"$2".file "$3"_dat\n";next}{printf FNR<2?tolower($3" file"$4"\n"):$3" "$4"\n"s}' d e
  2. filename filecontent
  3. SPECIALFILENAME.sh SPECIAL_CONTENT
  4. 10_AAA.file 20170101_dat
  5. 20_BBB.file 20170303_dat
复制代码

论坛徽章:
110
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期: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
发表于 2017-03-17 10:59 |显示全部楼层
本帖最后由 jason680 于 2017-03-17 11:00 编辑

回复 3# KEN6503

$ awk '{k=$1"_"$2}/^ZONE/{next}FNR==NR{f[k]=$3;t[k]=$4;next}{if(f[k])print t[k]>f[k];else print $3"_dat">k".file"}' file2 file1

$ grep . SPEC* *_*.file
SPECIALFILENAME.sh:SPECIAL_CONTENT
10_AAA.file:20170101_dat
20_BBB.file:20170303_dat

论坛徽章:
0
发表于 2017-03-17 19:34 |显示全部楼层
谢谢各位回复。刚刚把文件改了一下,第一行是没有的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP