标题: [文本处理] 批处理如何提取多个文本的的指定行到同一个新的文本 [打印本页]
作者: xuxnq 时间: 2016-8-12 11:07 标题: 批处理如何提取多个文本的的指定行到同一个新的文本
本帖最后由 pcl_test 于 2016-8-12 13:10 编辑
1.查找某个文件夹下面的*.btc文件。分别为1.btc 2.btc(这个扩展名可以用记事本打开,其实就是一个txt文件)
2.现在要将所有文件的第二行合并成一个base.btc文件,并且创建首行
举例
1.btc 文件内容为
BATCHHDR1,1
BATCHREC1,1,1,1,HPP 180,HPP 180,1,0
2.btc文件内容为
BATCHHDR1,2
BATCHREC1,2,2,2,HPP 180,HPP 180,2,0
现在要创建base.btc文件
第一行为固定BATCHHDR1,base
第二行开始合并1.btc的第二行
第三行为2.btc的第二行
第四行,依次类推
注: 所有的btc文件均只取第二行,其他不要。
作者: GNU 时间: 2016-8-12 13:11
- @echo off
- >"base.btc.tmp" echo BATCHHDR1,base
- (for /f "delims=" %%i in ('dir /b /a-d "*.btc"') do (
- call :GetLine "%%i"
- ))>>"base.btc.tmp"
- move /y "base.btc.tmp" "base.btc"
- goto :eof
-
- :GetLine
- for /f "skip=1 delims=" %%j in ('type "%~1"') do (
- echo,%%j
- goto :eof
- )
复制代码
作者: xxpinqz 时间: 2016-8-12 14:16
- findstr /n . *.btc|findstr "\.btc:2:"|findstr /ibvc:"base.btc:"
复制代码
call前要排除base.btc,否则第二次运行就出错了。
作者: Batcher 时间: 2016-8-13 22:01
回复 3# xxpinqz
管道是不是有点多了,dir后面用findstr排除一下就行了吧。
作者: 523066680 时间: 2016-8-13 22:07
Batcher最近工作量不饱和
作者: xxpinqz 时间: 2016-8-14 13:04
回复 4# Batcher
这两个条件写成一个不会写啊。。。
作者: pcl_test 时间: 2016-8-14 13:23
回复 6# xxpinqz
这样有不妥没?- dir /a-d/b *.btc|findstr /iv "^base.btc$"
复制代码
作者: xxpinqz 时间: 2016-8-14 21:51
回复 7# pcl_test
按这个条件:列出除文件base.btn外的*.btn文件的第二行文本。
作者: pcl_test 时间: 2016-8-14 22:18
本帖最后由 pcl_test 于 2016-8-14 22:22 编辑
回复 8# xxpinqz - @echo off&setlocal enabledelayedexpansion
- (
- echo;BATCHHDR1,base
- for /f "delims=" %%i in ('dir /a-d/b *.btc^|findstr /iv "^base.btc$"') do (
- (set /p #1=&set /p #2=)<"%%i"
- echo;!#2!
- set #2=
- )
- )>"base.btc"
- pause
复制代码
作者: pcl_test 时间: 2016-8-14 23:14
本帖最后由 pcl_test 于 2016-8-16 13:56 编辑
第三方http://www.bathome.net/s/tool/index.html?key=gawk- (echo;BATCHHDR1,base&gawk "FNR==2" *.btc)>"base.btc"&pause
复制代码
或- #*&cls&dir /a-d/b *.btc|gawk -f "%~f0"&pause&exit
- BEGIN{
- result="base.btc";
- s="BATCHHDR1,base\n";
- while(getline>0){
- file=$0;n=0;
- while(getline<file>0){
- n++;
- if(n==2){s=s""$0"\n";break}
- }
- }
- print s>result;
- }
复制代码
PS- @(echo;BATCHHDR1,base&powershell -c "dir *.btc|%%{$(gc $_)[1]}")&pause
复制代码
作者: xxpinqz 时间: 2016-8-16 00:14
回复 10# pcl_test
谢谢~,如果只用findstr命令来写的话,能更简吗。
哎呀,用移动网络真蛋疼,刷新了半个小时才进来。
作者: pcl_test 时间: 2016-8-16 14:02
回复 11# xxpinqz
想不到更简的,可只用两个findstr,但筛选条件就增加,而且仅用findstr,对于只有两行且末尾没有换行的文本处理也不好
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |