将特定列从一个文本文件复制到另一个文本文件

我有一堆的.txt文件,我想从一个特定的列(从所有这些)复制到一个.txt文件。 output.txt文件需要被创build

例如

file1.txt abc jkl file2.txt def mno file3.txt ghi pqr output.txt beh knq 

对于相同的我正在寻找一个batch fileWindows中,可以帮助我实现这一点。 任何forms的帮助将非常感激 :)。 如果这听起来是一个非常基本的问题,我就是批量编写脚本的新手。

这个批处理解决方案将从文件夹中的每个文件的所有行取第二个字符,并将其输出到output.txt ,哇,这真是一口! 🙂

 for %%a in (file*.txt) do ( for /f "tokens=2 delims= " %%b in (%%a) do echo %%b >>output.txt ) 

让他们排队会更困难,是严格必要的,还是他们可以在列表中,每行一个字符?

这可能不是你正在寻找的答案,但是我在处理批处理文件中的字符串时有一个类似的问题,虽然不是确切的问题。 我变得非常沮丧,我最终学习和使用python。

在Python中,这将如下简单:

 for i in range(1,4): f='c:\\file'+str(i)+'.txt' # Creates a variable for file1.txt, file2.txt formatted as c:\file1.txt. Path can be changed as needed. f = open(f) # Opens the file string=f.read() # Adds the contents of the file to a string print(string.split('\t')[1]+'\t'+string.split('\t')[4]) # splits the string by tabs, and returns the 2nd and 5th item. 

这将它打印到屏幕上,从这里写出来的文件是微不足道的。

编辑:不同的方式 (可能更直接),这个有另一个限制 – 可用变量/ env的大小。 空间(对XP来说,约32kB,不限于Vista以上 – 至少每个MS文档)。 它创建一个数组变量来保存你的转置线,然后输出它们:

 @echo off setlocal enabledelayedexpansion set "tab= " for %%F in (file*.txt) do ( set /a count=0 for /f "tokens=2 delims=%tab%" %%L in (%%F) do ( set /a count+=1 for /L %%T in (!count!,1,!count!) do ( set L[!count!]=!L[%%T]!%%L%tab% ) ) ) for /L %%L in (1,1,%count%) do echo !L[%%L]! 

首先,让我说batch不是最适合这个任务的(这在C会是微不足道的),但是如果你必须使用它,这里有一个办法:

 @echo off setlocal enabledelayedexpansion set "tab= " for /f %%C in ('dir /b file*.txt') do set /a count+=1 (for %%F in (file*.txt) do ( set line=0 for /f "tokens=2 delims=%tab%" %%V in (%%F) do ( set "outline=%%F" for /l %%N in (1,1,!line!) do (set "outline=%tab%!outline!") set outline=!outline!%tab%%%V set /a line+=1 echo !outline! ) )) >presorted.txt set /a cutoff=%count%-1 set line=0 for /f "tokens=2 delims=%tab%" %%O in ('sort /r presorted.txt') do ( set outp=%%O%tab%!outp! set /a lc=!line!^%%count% if !lc!==%cutoff% ( echo !outp! set "outp=" ) set /a line+=1 ) 

怎么运行的:

  • 首先,检查将处理多少个文件。 这给列的数量。 (首先forcount变量)
  • 读取每个输入文件,输出请求的列已修改,所以它将在前面加上等于行号和文件名的中间文件的标签数量。 (由()分隔的第二个块)
  • 对此文件进行排序,使连续行对应于最终输出中的连续列( sort /r presorted.txt
  • 使用modulo count来将行的块转换为列以开始新行(最后一个块)

笔记:

  • 列的顺序取决于文件名的排序顺序。
  • 所有文件必须具有相同的行数
  • "tab= " (在第三行)必须包含实际的选项卡
  • 它假设ascii-ish编码(在任何可打印字符之前的哪个tab排序)。
  • 它不承担! 输入中的字符(当延迟扩展开启时,需要特殊处理)
  • 输出到屏幕上。 如果需要输出文件,请将代码放入批处理文件,然后运行mybatchfile.bat >output.txt