Board logo

标题: [文本处理] 批处理如何提取多个文本的的指定行到同一个新的文本 [打印本页]

作者: 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

  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. )
复制代码

作者: xxpinqz    时间: 2016-8-12 14:16

  1. 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

这样有不妥没?
  1. 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
  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
复制代码

作者: pcl_test    时间: 2016-8-14 23:14

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

作者: 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