编辑:不同的方式这样做(可能更直接),这一个有另一个限制 - 可用变量/ 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
)
工作原理:
- 拳,检查有马ny文件将被处理。这给列的数量。 (初
for
和count
可变)
- 阅读改性每个输入文件,输出请求的列,以便它将由制表符等于行号和文件名,以中间文件的数目之前。 (由
()
分隔第二块)
- 排序此文件中,以便连续行对应于连续列在最终输出(
sort /r presorted.txt
)线的
- 移调块分成使用
modulo count
开始新线(最后for
块)
列
备注:
- 列的顺序取决于文件名的排序顺序。
- 所有文件都必须具有相同的行数
"tab= "
(在第3行)必须包含实际的制表
- 它假定ASCII上下的编码(其中前
tab
各种各样的任何可打印字符)。
- 它假设没有
!
字符输入(当延迟扩展时,它们需要特殊处理)
- 输出到屏幕。如果需要文件输出,将代码放入批处理文件中,然后运行
mybatchfile.bat >output.txt
来源
2012-12-20 21:12:54
wmz
Thanks @multiphrenic。只是为了澄清:我的txt文件中的列值是浮点数,所有列都是制表符分隔的! –
上面的代码应该可以工作,如果你愿意使用python。把它写到一个文件中就像添加下面这样简单: 'out = open('C:\\ output.txt','w')' 'print(...'to'file.write ...' 并用'file.close()' 完成,这样做的好处是它的可读性和容易随着您的需求变化而改变。 – pedram
当然,我会等待看看有没有人可以用解决方法是使用批处理脚本,如果没有,我会再次bug你:)。非常感谢,现在我知道我有一个备份计划;)! –