[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]bat如何查找指定字符串前的数字

现在有若干个txt文件,里面的格式基本一致,如其中一个txt的内容
.....
D 11  Final seasonally adjusted data
  From  2003.Jan to 2009.Dec
  Observations         84
-----------------------------------------------------------------------------
               Jan      Feb      Mar      Apr      May      Jun
               Jul      Aug      Sep      Oct      Nov      Dec        TOTAL  
-----------------------------------------------------------------------------
  2003      5436.48  5442.45  5459.32  5455.02  5457.04  5455.18
            5467.18  5475.61  5466.99  5434.10  5453.44  5460.38      65463.21

  2004      5448.64  5445.03  5452.04  5442.37  5441.17  5451.61
            5465.41  5473.73  5477.79  5451.15  5458.08  5457.64      65464.66

  2005      5540.25  5564.78  5556.51  5294.60  5321.58  5309.99
            5338.84  5411.57  5384.81  5471.84  5386.25  5392.34      64973.36

  2006      5279.67  5323.10  5288.35  5431.96  5516.74  5551.05
            5468.80  5461.49  5581.07  5529.45  5512.74  5438.14      65382.56

  2007      5577.12  5421.42  5367.01  5484.88  5606.76  5591.13
            5558.89  5551.72  5491.54  5380.13  5523.39  5488.72      66042.72

  2008      5365.49  5451.04  5592.67  5544.06  5368.22  5341.43
            5066.20  4995.55  5008.65  4517.47  3864.44  4075.86      60191.09

  2009      4595.22  5012.21  4990.79  4972.96  5347.19  5460.18
            5553.93  5559.29  5323.20  5578.44  5504.65  5613.92      63511.98

AVGE      5320.41  5380.01  5386.67  5375.12  5436.96  5451.51
            5417.04  5418.42  5390.58  5337.51  5243.29  5275.29
......
截取是一部分内容,现在希望得到5613.92这个数字,是D 11 Final seasonally adjusted data下面的第一个AVGE(绿色标注),然后之前的第二个数字5613.92,写到另一个txt中
恳求帮助!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复  tmplinshi
这样是否省点空间呢
terse 发表于 2013-10-25 18:07



谢谢,这样是好一点。

TOP

回复 33# tmplinshi
这样是否省点空间呢
  1. sed -nr "/D\s*11\s*Final seasonally adjusted data/I,/AVGE/I{/AVGE/I{x;s/^.* ([0-9.]+)\s+[0-9.]+.*$/\1/p;d;x};H}" *.txt
复制代码
1

评分人数

TOP

回复 33# tmplinshi

tmplinshi 大大,测试可用,另大大辛苦了,sed很强大,正在努力学习 !

TOP

本帖最后由 tmplinshi 于 2013-10-24 23:05 编辑
回复  tmplinshi

似乎还是这个问题,我现在打包上来3个文件,只能得到2个数字,不知道是不是我这边的问 ...
inflikt 发表于 2013-10-24 11:16
  1. sed -n -r "/D\s*11\s*Final seasonally adjusted data/I,/AVGE/I! d; // {x; s/^.* ([0-9.]+)\s+[0-9.]+.*$/\1/p; x; d}; /\./ H" *.txt
复制代码
谢谢楼主,通过你这个问题我对 sed 又更了解了一点。
1

评分人数

TOP

回复 29# inflikt

AVGE 上面目标行只存在一列的时候不够了, 只能再从上面借一行了 修正下试

TOP

回复 30# foxJL

多谢foxJL ,测试可用。

TOP

回复 28# inflikt


    终于知道是什么问题了,b.txt 2009的下面一行才一个数字...重新修改了一下,应该可以了.
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /a-d /b /s *.txt') do (
  3.     set "n="
  4.     for /f "usebackq tokens=1,* delims= " %%i in ("%%a") do (
  5.         if defined flag (
  6.         for %%A in (!str!) do (set/a n+=1,s=n-1 & set str_!n!=%%A)
  7.         if /i "%%i"=="avge" (set "flag=" & call echo "%%~nxa" --- %%str_!s!%%)
  8.     )
  9.     set str=%%i %%j
  10.     if /i "!str: =!"=="D11Finalseasonallyadjusteddata" set flag=1
  11.     )
  12. )
  13. pause
复制代码
1

评分人数

TOP

回复 27# terse

好像得出的结果很奇怪,我这边测试的3个文件,应该是得出3个数字,结果却是2个数字和一个中文。。。详见28楼附件

TOP

回复 26# tmplinshi

似乎还是这个问题,我现在打包上来3个文件,只能得到2个数字,不知道是不是我这边的问题

TOP

本帖最后由 terse 于 2013-10-24 15:20 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in ('dir /b/a-d *.txt') do (
  3.     set "flag="
  4.     for /f "usebackqtokens=1*" %%a in ("%%i") do (
  5.        if defined flag (
  6.             if /i "%%a" == "AVGE" (
  7.                for /f "tokens=*" %%c in ("!var: =\!\!str: =\!\..") do echo %%~nxc
  8.                set "flag="
  9.             ) else set "var=!str!"
  10.         ) else if /i "!str: =!" == "D11Finalseasonallyadjusteddata" set flag=1
  11.           set "str=%%a%%b"
  12.     )
  13. )
  14. pause
复制代码
1

评分人数

TOP

本帖最后由 tmplinshi 于 2013-10-23 17:40 编辑

sed 代码我测试没问题的,你是不是修改了代码?如果要加上 D11 的话,这样改:
  1. sed -n -r "/D\s*11\s*Final seasonally adjusted data/I,/AVGE/I! d; // {x; s/.* ([0-9.]+) +[0-9].*/\1/p}; /\./ h" *.txt
复制代码
如果结果不正确的话,最好把那个文本以附件形式上传上来。

TOP

回复 23# inflikt


再测试一下19楼的代码,在我本地是没有问题的.
因为公司电脑禁用了下载所以无法下载你的附件测试,只能用你16L的文本测试的.

TOP

回复 18# tmplinshi
  tmplinshi 大大,您的代码我测试下来跟foxJL的问题一样,就是16#代码执行不出结果,另大大辛苦了,夜里2点多还在帮我修改。

TOP

回复 21# foxJL

foxJL大大,辛苦了,您的代码我测试过,还是那个问题,如果AVGE上一行数据不够的话得不出结果,详见16#代码或是13#的附件

TOP

返回列表