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

[文本处理] 批处理如何提取多个文本的的指定行到同一个新的文本

本帖最后由 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文件均只取第二行,其他不要。
1

评分人数

    • pcl_test: 发帖前先使用论坛搜索PB -2

回复 11# xxpinqz

想不到更简的,可只用两个findstr,但筛选条件就增加,而且仅用findstr,对于只有两行且末尾没有换行的文本处理也不好

TOP

回复 10# pcl_test

谢谢~,如果只用findstr命令来写的话,能更简吗。

哎呀,用移动网络真蛋疼,刷新了半个小时才进来。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 pcl_test 于 2016-8-16 13:56 编辑

第三方http://www.bathome.net/s/tool/index.html?key=gawk
  1. (echo;BATCHHDR1,base&gawk "FNR==2" *.btc)>"base.btc"&pause
复制代码
  1. #*&cls&dir /a-d/b *.btc|gawk -f "%~f0"&pause&exit
  2. BEGIN{
  3.     result="base.btc";
  4.     s="BATCHHDR1,base\n";
  5.     while(getline>0){
  6.         file=$0;n=0;
  7.         while(getline<file>0){
  8.             n++;
  9.             if(n==2){s=s""$0"\n";break}
  10.         }
  11.     }
  12.     print s>result;
  13. }
复制代码
PS
  1. @(echo;BATCHHDR1,base&powershell -c "dir *.btc|%%{$(gc $_)[1]}")&pause
复制代码

TOP

本帖最后由 pcl_test 于 2016-8-14 22:22 编辑

回复 8# xxpinqz
  1. @echo off&setlocal enabledelayedexpansion
  2. (
  3.     echo;BATCHHDR1,base
  4.     for /f "delims=" %%i in ('dir /a-d/b *.btc^|findstr /iv "^base.btc$"') do (
  5.         (set /p #1=&set /p #2=)<"%%i"
  6.         echo;!#2!
  7.         set #2=
  8.     )
  9. )>"base.btc"
  10. pause
复制代码

TOP

回复 7# pcl_test

按这个条件:列出除文件base.btn外的*.btn文件的第二行文本。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 6# xxpinqz

这样有不妥没?
  1. dir /a-d/b *.btc|findstr /iv "^base.btc$"
复制代码

TOP

回复 4# Batcher

这两个条件写成一个不会写啊。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

Batcher最近工作量不饱和

TOP

回复 3# xxpinqz


    管道是不是有点多了,dir后面用findstr排除一下就行了吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. findstr /n . *.btc|findstr "\.btc:2:"|findstr /ibvc:"base.btc:"
复制代码
call前要排除base.btc,否则第二次运行就出错了。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

  1. @echo off
  2. >"base.btc.tmp" echo BATCHHDR1,base
  3. (for /f "delims=" %%i in ('dir /b /a-d "*.btc"') do (
  4.     call :GetLine "%%i"
  5. ))>>"base.btc.tmp"
  6. move /y "base.btc.tmp" "base.btc"
  7. goto :eof
  8. :GetLine
  9. for /f "skip=1 delims=" %%j in ('type "%~1"') do (
  10.     echo,%%j
  11.     goto :eof
  12. )
复制代码

TOP

返回列表