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

[已解决]sed命令怎么提取多个txt文本的指定行

本帖最后由 w609053988 于 2016-11-21 14:26 编辑

sed命令如何批量提取大量文件的数据:javascript:;
1.提取数据的格式:.txt、.csv,提取的数量比较多,可能几千个,需要考虑到效率
2.提取每个文本M-N行的数据,或者某两个字符串之间的数据,如果能定位到某个字符串(比如字符串在第10行),我要提取的数据在11-20,以字符串为参考,提取出11-20行的数据

工作需要经常处理分析一些数据(*.txt、*.csv等),其实VBA也都可以实现上面的功能,但个人感觉效率有点慢,试验过提取500个,得花费3分多中,如要处理大几千的数据,那就太慢了
想请教批处理有什么好的方法吗?不仅限于sed命令

批处理命令也是最近才接触了,把基本的系统自带的学习了下,虽然那些命令过时已久,但魅力仍在,从findstr命令开始对批处理感兴趣了,
因为有一次处理7000多txt文件,用findstr批量提取某一行数据,只花费了10秒不到,当时惊吓到我了,如果用VBA的话可能需要四五十分钟,
本人新手,望大家指点,互相学习!

@echo off
del 3.ini
sed  -n "1,3p" *.txt>>3.ini
pause
上面的代码为何只提取到了目前下的第一个txt文件?
1

评分人数

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

本帖最后由 pcl_test 于 2016-11-21 18:22 编辑
  1. #*http://www.bathome.net/s/tool/index.html?down&key=gawk
  2. #*提取多个文本指定字符串所在行之后的10行内容
  3. #*&cls&dir /a-d/b *.txt|gawk -f "%~f0"|find /v ""&pause&exit
  4. BEGIN{
  5.     while(getline file>0){
  6.         t=0;
  7.         while(getline<file>0){
  8.             if(t>0&&t<=11)print;
  9.             if(index($0, "指定字符串"))t=1;
  10.             if(t)t++;if(t>11)break;
  11.         }
  12.     }
  13. }
复制代码
2

评分人数

TOP

回复 2# pcl_test


    感谢,才刚开始学习sed,对gawk不太懂,能提供gawk的使用说明吗,带实例的更好,
另代码刚刚测试可用,但是能把提取的内容输出到1.csv中吗?

TOP

#*&cls&dir /a-d/b *.txt|gawk -f "%~f0">"result.log"&pause&exit
http://www.bathome.net/redirect. ... 6603&ptid=22680官网

TOP

回复 4# pcl_test


    感谢版主,看来需要好好学习了!

TOP

回复 4# pcl_test

可惜给的帖子没写完!

TOP

本帖最后由 pcl_test 于 2016-11-21 00:14 编辑

回复 6# w609053988
  要你看的是两个官网教程
http://www.gnu.org/software/gawk/manual/gawk.html
http://www.gnu.org/software/sed/manual/sed.html

TOP

回复 7# pcl_test


    官网教程看到了,但是纯英文,不太好懂,那个帖子蛮好的,可惜等3年了还没更新

TOP

回复 2# pcl_test


    版主,能解释下每行代码的意思吗?感觉gwak与其他的那些批处理语法完全不同啊!

TOP

回复 8# w609053988


O’Reilly sed & awk 2nd Edition 中文高清修订第3版
http://bbs.bathome.net/thread-13203-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 pcl_test 于 2016-12-1 13:36 编辑

回复 9# w609053988

好吧,转为纯批
  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/b *.txt') do call :loop "%%a"
  3. pause&exit
  4. :loop
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%b in ('type "%~1"') do (
  7.     set "str=%%b"
  8.     if defined t if !t! leq 11 echo;%%b
  9.     if "!str:指定字符串=!" neq "%%b" set t=1;
  10.     if defined t set /a t+=1
  11.     if !t! gtr 11 goto :eof
  12. )
复制代码
  1. powershell -c "dir *.txt|%%{if([IO.File]::ReadAllText($_, [Text.Encoding]::Default) -match '(?<=.*?指定字符串.*?\n)(.+?(\n|$)){1,10}'){$matches[0]}}"
  2. pause
复制代码
  1. powershell -c "dir *.txt|%%{$t=0;gc $_|%%{if(($t -gt 0) -and ($t -le 11)){$_};if($_.contains('指定字符串')){$t=1};if($t){$t++}}}"
  2. pause
复制代码
1

评分人数

TOP

回复 10# Batcher

感谢,资料已下,如有问题还望不吝赐教!

TOP

回复 11# pcl_test


    纯批已测试,没问题,感谢斑竹!

TOP

本帖最后由 w609053988 于 2016-11-30 15:59 编辑

纯批的for循环还能优化效率吗?我提取7000多个csv的指定区域输出到某个文件,需要花费15分钟,前面比较快,后面越来越慢!纯gawk效率确实高太多,几秒钟搞定,但是提取上面7000多确只抓出了2000多,纯批的for全部抓取出来了,不知道什么问题,文件名包含大小写字母和数字,还有英文的_和-,文件名都是以字母开头,另纯gawk的可以抓取每个文件选取的内容前先把文件名抓取,一同输出到单独的文件中吗?

TOP

回复 2# pcl_test


    后面我自己创建了4000个文件测试,发现也只处理了2045个文本,这是为什么?

TOP

返回列表