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

ChinaUnix.net

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

[文本处理] 脚本的第二个while loop 可以不可以用其他代替(增加一点新要求) [复制链接]

论坛徽章:
0
发表于 2017-03-19 03:56 |显示全部楼层
本帖最后由 KEN6503 于 2017-03-21 08:11 编辑

最初的要求得贴子。现在要求有点改了:
http://bbs.chinaunix.net/thread-4260429-1-1.html

要求是:用FILE1中的前俩个列在file2中找的相应的记录,然后,根据文件2中的第三列(文件名)创建一个文件,内容是:文件1的第三列和文件2的第四列。
FILE1
AAA FIRST 20170203
BBB SECOND 20170204


FILE2
AAA FIRST file1.txt content1
BBB SECOND file2.txt content2


想要的结果:
产生俩个文件:
文件1
file1.txt。  内容是:content1=20170203
文件2
file2.txt。  内容是:content2=20170204

自己用while loop写了一个,但是感觉第二个loop效率比较低,不知道有没有什么好方法。

另外,想用awk, 但是实在是不知道如何用“echo $3 > $2" 生成文件。

谢谢几位大师的回复。现在想增加一点:就是如果在file2中找不到相关的数据,就把相关信息写到:errorlog中。


在我写的那个脚本中,highlighted in RED


在awk中应该如何处理?


谢谢大师。


那位大师帮忙看看吧,谢谢。


  1. <p>#!/bin/ksh
  2. IFS=","
  3. #
  4. # variable initialization
  5. #
  6. sfiledir=/home/user
  7. tfiledir=/home/user
  8. errdir=/home/user
  9. errfilename=m_records.txt
  10. # delete all old files
  11. # cd ${tfiledir}
  12. #find . -name file* -exec rm {}
  13. # error count is 0 before while loop
  14. #
  15. error_cnt=0
  16. # start first file loop
  17. #while read zone feed date
  18.         do
  19.                 echo $zone, $feed, $date
  20. # set exist flag
  21. #
  22.                 exist_flag=0
  23. #
  24. # Start second file loop
  25. #
  26.                 while read zone1 feed1 fname fct
  27.                         do
  28.                                 if [ $zone == $zone1 ] && [ $feed == $feed1 ]; then
  29.                                         echo "${fct}${date}" > ${tfiledir}/"${fname}"
  30.                                         exist_flag=1   
  31.                                         break
  32.                                 fi
  33.                         done<metapull.txt
  34.              <strong> </strong><font color="red"><strong>  if [ exist_flag -eq 0 ]; then
  35.                         echo $zone, $feed " doesn't exisit in meta file" >> "${errdir}"/"${errfilename}"
  36.                         error_cnt=1
  37.                 fi</strong></font>
  38.         done<sample.txt
  39. #
  40. # checking any feed missed in metafile
  41. #</p><p>if [ error_cnt -ne 0 ]; then
  42.         echo "Some feeds missing detail information, please check file " ${errfilename}
  43.         exit 1
  44. fi
  45. </p>
复制代码


论坛徽章:
112
技术图书徽章
日期: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-19 09:09 |显示全部楼层
本帖最后由 jason680 于 2017-03-19 10:32 编辑

回复 1# KEN6503


What You Think Is What You Code(WYTIWYC)

要求是:用FILE1中的前俩个列在file2中相应的记录,然后,根据文件2中的第三列(文件名)创建一个文件,内容是:文件1的第三列文件2的第四列

用FILE1中的前俩个列在file2中相应的记录  ==> 先读取file2


$ awk '{key=$1","$2}FNR==NR{file[key]=$3;cont[key]=$4;next}{if(file[key]){print cont[key]"="$3 > file[key]}}' F2 F1

$ grep . file?.txt
file1.txt:content1=20170203
file2.txt:content2=20170204

论坛徽章:
27
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-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:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-03-19 10:08 |显示全部楼层

  1. awk 'NR==FNR{a[$1$2]=$3;next}a[$1$2]{print $4"="a[$1$2] > $3}' FILE1 FILE2
复制代码

论坛徽章:
0
发表于 2017-03-19 10:09 |显示全部楼层
回复 2# jason680
谢谢。正是我需要的。
佩服,佩服。


论坛徽章:
0
发表于 2017-03-19 10:20 |显示全部楼层
回复 3# moperyblue

谢谢你,这个结果好像不太对。print 里的$3和$4是file1里的,而不是file2的。
  1. awk 'NR==FNR{a[$1$2]=$3;next}a[$1$2<font color="red">]{print $4"="a[$1$2] > $3}</font>'
复制代码


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

回复 3# moperyblue

对不起,发重了

论坛徽章:
27
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-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:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-03-19 10:29 |显示全部楼层
本帖最后由 moperyblue 于 2017-03-19 10:37 编辑

回复 6# KEN6503

  1. awk 'NR==FNR{a[$1$2]=$3;b[$1$2]=$4;next}a[$1$2]{print b[$1$2]"="$3 > a[$1$2]}' FILE2 FILE1
复制代码

论坛徽章:
0
发表于 2017-03-19 10:38 |显示全部楼层
回复 7# moperyblue

对不起,是我错了。结果是对的。
你能不能解释一下,为什么你读文件的顺序是file1,file2, 而楼上的是file2, file1。我感觉你们二位的script不同点是:{key=$1","$2},而你的是在a[$1$2]。 但是为什么,读file的顺序会不一样呢?

论坛徽章:
27
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-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:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-03-19 10:40 |显示全部楼层
本帖最后由 moperyblue 于 2017-03-19 10:41 编辑

回复 8# KEN6503


这要看你需要哪个文件作为"参照"  如果是一一对应的匹配 哪个放在前面无所谓

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

回复 9# moperyblue
我说的是下面这俩个,为什么读文件的顺序会恰好相反。
好像明白了。我再想想。谢谢了。



  1. <p>awk '{key=$1","$2}FNR==NR{file[key]=$3;cont[key]=$4;next}{if(file[key]){print cont[key]"="$3 > file[key]}}' F2 F1</p><p><p>awk 'NR==FNR{a[$1$2]=$3;next}a[$1$2]{print $4"="a[$1$2] > $3}' FILE1 FILE2</p>
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票7.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP