免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求文本处理方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-22 09:31 |只看该作者 |倒序浏览
文本是这样的,好吧,我的目的是要合并,cat之后的结果就是这样:
#this is my file
%start
      16 |       42 |        1 | "0000000762"
      16 |       43 |        1 | "0000000763"
      16 |       44 |        1 | "0000000764"
      16 |       45 |        1 | "0000000765"
      16 |       46 |        1 | "0000000766"
      16 |       47 |        1 | "0000000767"
      16 |       48 |        1 | "0000000768"
%
I =      31
#this is my file
%start
       1 |        1 |        1 | "0000000001"
       2 |        1 |        1 | "0000000002"
       3 |        1 |        1 | "0000000003"
       4 |        1 |        1 | "0000000004"
       5 |        1 |        1 | "0000000005"
       6 |        1 |        1 | "0000000006"
       7 |        1 |        1 | "0000000007"
       8 |        1 |        1 | "0000000008"
%
I = 20
我想要的结果是这样的:

#this is my file
%start
      16 |       42 |        1 | "0000000762"
      16 |       43 |        1 | "0000000763"
      16 |       44 |        1 | "0000000764"
      16 |       45 |        1 | "0000000765"
      16 |       46 |        1 | "0000000766"
      16 |       47 |        1 | "0000000767"
      16 |       48 |        1 | "0000000768"
       1 |       49 |        1 | "0000000769"
       2 |       49 |        1 | "0000000770"
       3 |       49 |        1 | "0000000771"
       4 |       49 |        1 | "0000000772"
       5 |       49 |        1 | "0000000773"
       6 |       49 |        1 | "0000000774"
       7 |       49 |        1 | "0000000775"
       8 |       49 |        1 | "0000000776"
%
I = 20

改动第二列和第四列,涉及到加和,由于文本量太多,我只能求助于脚本了。求问大家有什么好办法么?谢谢了。

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-07-22 09:49 |只看该作者
本帖最后由 Herowinter 于 2014-07-22 09:49 编辑

回复 1# zsjan
I =31和I =20是固定的文本吗?可以用来定位要操作的记录?

   

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
3 [报告]
发表于 2014-07-22 10:45 |只看该作者
  1. awk -F"[ |]+" 'NR==FNR&&$0!~/^%$/&&$0!~/^I/{print $0;a=$3;b=$5;gsub(/"/,"",b)} NR==FNR{next} $0!~/^%/&&$0!~/^I/{$3=$3+a;gsub(/"/,"",$5);$5=$5+b} FNR>1&&$0!~/^%$/&&$0!~/^I/{printf("%8d |%9d |%9d | \"%010d\"\n",$2,$3,$4,$5)} FNR>1&&$0~/^%/||$0~/^I/{print $0}' o oo
复制代码
猜一把

论坛徽章:
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
4 [报告]
发表于 2014-07-22 11:34 |只看该作者
回复 1# zsjan

Would you like this way ...

$ awk -F'|' '!S{print}/^%start/{S=1}/^I =/{I=$0}NF==4{gsub("\"","",$4);n2=n2==""?$2:n2+1;n4=n4==""?$4:n4+1;printf("%8d |%8d |%8d | \"%010d\"\n",$1,n2,$3,n4)}END{print "%\n"I}' FILE
#this is my file
%start
      16 |      42 |       1 | "0000000762"
      16 |      43 |       1 | "0000000763"
      16 |      44 |       1 | "0000000764"
      16 |      45 |       1 | "0000000765"
      16 |      46 |       1 | "0000000766"
      16 |      47 |       1 | "0000000767"
      16 |      48 |       1 | "0000000768"
       1 |      49 |       1 | "0000000769"
       2 |      50 |       1 | "0000000770"
       3 |      51 |       1 | "0000000771"
       4 |      52 |       1 | "0000000772"
       5 |      53 |       1 | "0000000773"
       6 |      54 |       1 | "0000000774"
       7 |      55 |       1 | "0000000775"
       8 |      56 |       1 | "0000000776"
%
I = 20

   

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-07-22 11:55 |只看该作者
本帖最后由 Herowinter 于 2014-07-22 11:58 编辑

没楼上的大神写得好。
回复 1# zsjan
  1. awk -F'|' 'function trim(s){gsub(/^[[:space:]]*|[[:space:]]*$/,"",s);return s} /^%[[:space:]]*$/{++n} !n&&NF==4{s1=trim($2);s2=gensub(/.*"([0-9]+).*/,"\\1",1,$4)} n&&NF==4{$0=sprintf("%8d |%9d |%9d | \042%010d\042",trim($1),s1+trim($2),trim($3),s2+gensub(/.*"([0-9]+).*/,"\\1",1,$4))} n!=1||NF==4' i
  2. #this is my file
  3. %start
  4.       16 |       42 |        1 | "0000000762"
  5.       16 |       43 |        1 | "0000000763"
  6.       16 |       44 |        1 | "0000000764"
  7.       16 |       45 |        1 | "0000000765"
  8.       16 |       46 |        1 | "0000000766"
  9.       16 |       47 |        1 | "0000000767"
  10.       16 |       48 |        1 | "0000000768"
  11.        1 |       49 |        1 | "0000000769"
  12.        2 |       49 |        1 | "0000000770"
  13.        3 |       49 |        1 | "0000000771"
  14.        4 |       49 |        1 | "0000000772"
  15.        5 |       49 |        1 | "0000000773"
  16.        6 |       49 |        1 | "0000000774"
  17.        7 |       49 |        1 | "0000000775"
  18.        8 |       49 |        1 | "0000000776"
  19. %
  20. I = 20

  21. cat i
  22. #this is my file
  23. %start
  24.       16 |       42 |        1 | "0000000762"
  25.       16 |       43 |        1 | "0000000763"
  26.       16 |       44 |        1 | "0000000764"
  27.       16 |       45 |        1 | "0000000765"
  28.       16 |       46 |        1 | "0000000766"
  29.       16 |       47 |        1 | "0000000767"
  30.       16 |       48 |        1 | "0000000768"
  31. %
  32. I = 31
  33. #this is my file
  34. %start
  35.        1 |        1 |        1 | "0000000001"
  36.        2 |        1 |        1 | "0000000002"
  37.        3 |        1 |        1 | "0000000003"
  38.        4 |        1 |        1 | "0000000004"
  39.        5 |        1 |        1 | "0000000005"
  40.        6 |        1 |        1 | "0000000006"
  41.        7 |        1 |        1 | "0000000007"
  42.        8 |        1 |        1 | "0000000008"
  43. %
  44. I = 20
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-07-22 12:30 |只看该作者
Herowinter 发表于 2014-07-22 11:55
没楼上的大神写得好。
回复 1# zsjan


嗯,你这个写法很有用阿!

论坛徽章:
0
7 [报告]
发表于 2014-07-22 12:46 |只看该作者
jason680 发表于 2014-07-22 11:34
回复 1# zsjan

Would you like this way ...


能不能解释一下n2=n2==""?$2:n2+1;这个判断语句呢?
另外,我的第二个文件第二列是同一个数,要怎么修改一下好呢?
谢谢。

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2014-07-22 12:49 |只看该作者
回复 7# zsjan

相当于
  1. if(n2=="")
  2.     n2=$2
  3. else
  4.     n2=n2+1
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP