免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 闸北陆小洪
打印 上一主题 下一主题

[文本处理] 求助大神一个时间替换问题 [复制链接]

论坛徽章:
780
金牛座
日期: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
11 [报告]
发表于 2013-11-26 11:56 |只看该作者
同一行中会出现2个数据吗?比如
year=<{y1}> AND month=<{m1}> AND day=<{d1}> year=<{y2}> AND month=<{m2}> AND day=<{d2}>
在一行中。

论坛徽章:
0
12 [报告]
发表于 2013-11-26 11:59 |只看该作者
回复 11# Herowinter

有可能的  因为这是用户输入的  你只能告诉用户"我会把你输入的<{dx}>替换为x天之前的日"

别的你无法控制用户的输入   这就是需要<{}>的用处


   

论坛徽章:
780
金牛座
日期: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
13 [报告]
发表于 2013-11-26 12:17 |只看该作者
回复 12# 闸北陆小洪
新手表示难度太高,单行还勉强可以,多行模式不大会,
输入不规范的话,还可能出现这种
year=<{y1}> AND month=<{m1}> AND day=<{d1}> year=<{
y2}> AND month=<{m2}> AND day=<{d2}>

这可如何是好?
坐等大神解答了


   

论坛徽章:
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
14 [报告]
发表于 2013-11-26 15:56 |只看该作者
本帖最后由 jason680 于 2013-11-26 16:12 编辑

回复 1# 闸北陆小洪

How about this

$ echo "year=<{y1}> AND month=<{m1}> AND day=<{d1}>" | awk -F'[{}]' 'function get_ymd(n,k,T){split("ymd",ymd,"");for(k in ymd){if(sub("^"ymd[k],"",n)){t=systime()-86400*n;return(strftime("%"ymd[k],t) + ((ymd[k]=="y")?2000:0))}}return n}{for(n=0;n++<NF;){if(!(n%2))$n=get_ymd($n);printf("%s",$n)}print""}'
year=<2013> AND month=<11> AND day=<25>

$ echo "year=<{y1}> AND month=<{m1}> AND day=<{d1}>" | perl -lape 'BEGIN{%ymd=("y",5,"m",4,"d",3)}{s/\{([ymd])(\d+)\}/(localtime(time-86400*$2))[$ymd{$1}]+{"y",1900,"m",1,"d",0}->{$1}/ge}'
year=<2013> AND month=<11> AND day=<25>

   

论坛徽章:
780
金牛座
日期: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
15 [报告]
发表于 2013-11-26 16:27 |只看该作者
本帖最后由 Herowinter 于 2013-11-26 18:08 编辑

只会写这种,单行比较格式化的数据。
输入文件i  输出文件i1
  1. #!/bin/bash

  2. if [ -f i1 ]; then
  3.   rm i1
  4. fi

  5. while read line
  6. do

  7. n=$(echo $line | awk -F' AND ' '{yn=gensub(/year=<{y([0-9]+)}>/,"\\1",1,$1);mn=gensub(/month=<{m([0-9]+)}>/,"\\1",1,$2);dn=gensub(/day=<{d([0-9]+)}>/,"\\1",1,$3);print yn,mn,dn}')

  8. yn=$(echo $n | awk '{print $1}')
  9. mn=$(echo $n | awk '{print $2}')
  10. dn=$(echo $n | awk '{print $3}')

  11. year=$(date --date "$yn days ago" +%Y)
  12. month=$(date --date "$mn days ago" +%m)
  13. day=$(date --date "$dn days ago" +%d)

  14. echo "year=<{$year}> AND month=<{$month}> AND day=<{$day}>">>i1

  15. done <i


  16. cat i
  17. year=<{y1}> AND month=<{m1}> AND day=<{d1}>
  18. year=<{y365}> AND month=<{m31}> AND day=<{d2}>

  19. cat i1
  20. year=<{2013}> AND month=<{11}> AND day=<{25}>
  21. year=<{2012}> AND month=<{10}> AND day=<{24}>
复制代码

论坛徽章:
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
16 [报告]
发表于 2013-11-26 17:24 |只看该作者
s="year=<{y1}> AND month=<{m1}> AND day=<{d1}>"
eval `echo $s | egrep -o "<[^<>]+>" | tr -d "<>{}" | xargs -I{} echo {} | awk '/y/{num=sub(/[a-z]/,"");"date +%Y -d-"num"year" | getline t;print "y="t} /m/{num=sub(/[a-z]/,"");"date +%m -d-"num"month" | getline t;print "m="t} /d/{num=sub(/[a-z]/,"");"date +%d -d-"num"day" | getline t;print "d="t}'`
echo $s | sed -r "s/<\{y[0-9]\}>/$y/g; s/<\{m[0-9]\}>/$m/g; s/<\{d[0-9]\}>/$d/g"

论坛徽章:
0
17 [报告]
发表于 2013-11-26 19:23 |只看该作者
试了是多种方法  太麻烦了  换java了

多谢各位

论坛徽章:
0
18 [报告]
发表于 2013-11-28 22:06 |只看该作者
回复 17# 闸北陆小洪
用Perl:

#!/usr/bin/perl
while ($S=<>){
while ($S =~ m/(<{(\D)(\d+)}>)/g){
my $match = $1;
my $y = $2;
my $n = $3;
my $time = `date +%$y --date='$n days ago'` ;
$S =~ s/$match/$time/;
$S =~ s/\n//g;
}
print "$S\n";
}
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP