标题: [已解决]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 编辑
- #*http://www.bathome.net/s/tool/index.html?down&key=gawk
- #*提取多个文本指定字符串所在行之后的10行内容
- #*&cls&dir /a-d/b *.txt|gawk -f "%~f0"|find /v ""&pause&exit
- BEGIN{
- while(getline file>0){
- t=0;
- while(getline<file>0){
- if(t>0&&t<=11)print;
- if(index($0, "指定字符串"))t=1;
- if(t)t++;if(t>11)break;
- }
- }
- }
复制代码
作者: 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
好吧,转为纯批- @echo off
- for /f "delims=" %%a in ('dir /a-d/b *.txt') do call :loop "%%a"
- pause&exit
- :loop
- setlocal enabledelayedexpansion
- for /f "delims=" %%b in ('type "%~1"') do (
- set "str=%%b"
- if defined t if !t! leq 11 echo;%%b
- if "!str:指定字符串=!" neq "%%b" set t=1;
- if defined t set /a t+=1
- if !t! gtr 11 goto :eof
- )
复制代码
- powershell -c "dir *.txt|%%{if([IO.File]::ReadAllText($_, [Text.Encoding]::Default) -match '(?<=.*?指定字符串.*?\n)(.+?(\n|$)){1,10}'){$matches[0]}}"
- pause
复制代码
- powershell -c "dir *.txt|%%{$t=0;gc $_|%%{if(($t -gt 0) -and ($t -le 11)){$_};if($_.contains('指定字符串')){$t=1};if($t){$t++}}}"
- 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 编辑
- @echo off & setlocal enabledelayedexpansion
- (for %%i in (*.txt) do (
- set "n="
- for /f "delims=" %%j in ('type "%%i"') do (
- set "s=%%j"
- if defined n (
- if !n! LEQ 10 set /a n+=1 & echo;!s!
- ) else (
- if "!s:abc=!" NEQ "!s!" set n=1
- )
- )
- ))>Result.Log
复制代码
作者: WHY 时间: 2016-11-30 22:28
- PowerShell -c "Select-String -Path *.txt -Encoding Default 'abc' -Context 10|%%{$_.Context.PostContext}">Result.Log
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |