4

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

例如

file1.txt
a b c
j k l

file2.txt
d e f
m n o

file3.txt
g h i
p q r

output.txt
b e h
k n q

同样,我正在寻找可以帮助我实现这一目标的 Windows 批处理文件。任何形式的帮助将非常感激 :)。我只是批处理脚本的新手,因此如果这听起来是一个非常基本的问题,请原谅我。

4

3 回答 3

1

这可能不是您要寻找的答案,但是在处理批处理文件中的字符串时,我遇到了类似但不完全的问题。我变得非常沮丧,最终学习并使用了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. 

这会将其打印到屏幕上,从这里将其写入文件是微不足道的。

于 2012-12-20T14:13:01.420 回答
1

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

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

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

于 2012-12-20T14:24:20.920 回答
0

编辑:这样做的不同方式(可能更直接),这个有另一个限制 - 可用变量/环境的大小。空间(对于 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使用开始新行(最后一个for块)将行块转置为列

笔记:

  • 列的顺序取决于文件名的排序顺序。
  • 所有文件的行数必须相同
  • "tab= "(在第 3 行)必须包含实际选项卡
  • 它采用 ascii-ish 编码(tab在任何可打印字符之前排序)。
  • 它假定!输入中没有字符(当延迟扩展打开时,它们需要特殊处理)
  • 输出到屏幕。如果需要文件输出,将代码放入批处理文件,然后运行mybatchfile.bat >output.txt
于 2012-12-20T21:12:54.313 回答