Board logo

标题: [已解决]sed命令怎么提取多个txt文本的指定行 [打印本页]

作者: w609053988    时间: 2016-11-20 21:17     标题: [已解决]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文件?
作者: pcl_test    时间: 2016-11-20 23:02

本帖最后由 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. }
复制代码

作者: w609053988    时间: 2016-11-20 23:22

回复 2# pcl_test


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

#*&cls&dir /a-d/b *.txt|gawk -f "%~f0">"result.log"&pause&exit
http://www.bathome.net/redirect. ... 6603&ptid=22680官网
作者: w609053988    时间: 2016-11-20 23:57

回复 4# pcl_test


    感谢版主,看来需要好好学习了!
作者: w609053988    时间: 2016-11-21 00:08

回复 4# pcl_test

可惜给的帖子没写完!
作者: pcl_test    时间: 2016-11-21 00:13

本帖最后由 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
作者: w609053988    时间: 2016-11-21 01:00

回复 7# pcl_test


    官网教程看到了,但是纯英文,不太好懂,那个帖子蛮好的,可惜等3年了还没更新
作者: w609053988    时间: 2016-11-21 10:33

回复 2# pcl_test


    版主,能解释下每行代码的意思吗?感觉gwak与其他的那些批处理语法完全不同啊!
作者: Batcher    时间: 2016-11-21 10:56

回复 8# w609053988


O’Reilly sed & awk 2nd Edition 中文高清修订第3版
http://bbs.bathome.net/thread-13203-1-1.html
作者: pcl_test    时间: 2016-11-21 13:20

本帖最后由 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
复制代码

作者: w609053988    时间: 2016-11-21 13:30

回复 10# Batcher

感谢,资料已下,如有问题还望不吝赐教!
作者: w609053988    时间: 2016-11-21 14:27

回复 11# pcl_test


    纯批已测试,没问题,感谢斑竹!
作者: w609053988    时间: 2016-11-30 15:53

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

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

回复 2# pcl_test


    后面我自己创建了4000个文件测试,发现也只处理了2045个文本,这是为什么?
作者: pcl_test    时间: 2016-11-30 18:21

#*http://www.bathome.net/s/tool/index.html?down&key=gawk
#*提取多个文本指定字符串所在行之后的10行内容
#*&cls&dir /a-d/b *.txt|gawk -f "%~f0">"result.log"&pause&exit
BEGIN{
    while(getline file>0){
        t=0;print file;
        while(getline<file>0){
            if(t>0&&t<=11)print;
            if(index($0, "指定字符串"))t=1;
            if(t)t++;if(t>11)break;
        }
        close(file);
    }
}
作者: w609053988    时间: 2016-11-30 20:12

回复 16# pcl_test

非常感谢,这个测试提取4000文件没问题!
作者: WHY    时间: 2016-11-30 22:27

本帖最后由 WHY 于 2016-12-1 08:09 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. (for %%i in (*.txt) do (
  3.     set "n="
  4.     for /f "delims=" %%j in ('type "%%i"') do (
  5.         set "s=%%j"
  6.         if defined n (
  7.             if !n! LEQ 10 set /a n+=1 & echo;!s!
  8.         ) else (
  9.             if "!s:abc=!" NEQ "!s!" set n=1
  10.         )
  11.     )
  12. ))>Result.Log
复制代码

作者: WHY    时间: 2016-11-30 22:28

  1. PowerShell -c "Select-String -Path *.txt -Encoding Default 'abc' -Context 10|%%{$_.Context.PostContext}">Result.Log
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2