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

[文本处理] 批处理如何对文本里各列数据分别除以指定数值

本帖最后由 meiszp 于 2016-9-29 11:18 编辑

文件夹下有许多数据文件(扩展名为txt或指定),文件内容为多列数据(下面为7列,但实际可能更多),想对每列除以一个数,比如第1列除以10,第2列除以20等等。
求大侠赐教。

-6.70552254e-007  4.56646750e+005  6.89739219e+004 -3.81691500e+005  2.08684141e+005 -4.90864719e+005  3.10406906e+005
  5.00000007e-002  4.61931250e+005  1.36446094e+005 -3.59222750e+005  2.07390922e+005 -4.75073250e+005  3.40052250e+005
  9.99993235e-002  4.98387563e+005  2.60942938e+005 -3.52485344e+005  2.02917281e+005 -4.60640719e+005  3.66940344e+005
  1.50000006e-001  5.08161344e+005  3.97039625e+005 -3.58057656e+005  1.97205422e+005 -4.43923438e+005  3.92823375e+005
  1.99999332e-001  4.81562063e+005  5.06175219e+005 -3.86291063e+005  1.91434969e+005 -4.22848281e+005  4.17620406e+005
  2.50000000e-001  4.46009031e+005  5.63322500e+005 -4.38631031e+005  1.88274859e+005 -3.97913656e+005  4.41026063e+005
  2.99999326e-001  4.34343250e+005  5.40127375e+005 -4.90687344e+005  1.88438328e+005 -3.70999531e+005  4.62318875e+005
  3.49999994e-001  4.58196469e+005  4.70192063e+005 -5.18217250e+005  1.90427172e+005 -3.43401031e+005  4.79834125e+005
  3.99999321e-001  4.85120313e+005  3.84186875e+005 -5.56579813e+005  1.93310938e+005 -3.15954906e+005  4.95534531e+005


数据文件见网盘 http://share.weiyun.com/6bdcb931f8703b3830a9c9d711f5e053

本帖最后由 pcl_test 于 2016-9-29 23:40 编辑
  1. #*第三方http://www.bathome.net/s/tool/index.html?key=gawk
  2. #*&cls&dir /a-d/b *.txt|gawk -f "%~f0"&pause&exit
  3. BEGIN{
  4.     folder="结果";
  5.     system("md \""folder"\" 2>nul");
  6.     list="1=10,2=20,3=30,4=40,5=50,6=60,7=70,8=80,9=90,10=100,11=110,12=120";
  7.     #此处定义每列的除数,如1=10表示第1列除以10,2=20表示第2列除以20……以此类推,
  8.     #只要定义到最大的列即可,如最多有20列,则定义到20=除数,
  9.     #如果不对某列操作,则该列不需定义除数或定义除数为1
  10.     split(list,a,",");
  11.     for(i=1;i<=length(a);i++){
  12.         split(a[i],b,"=");
  13.         map[b[1]]=b[2];
  14.     }
  15.     while(getline file>0){
  16.         while(getline<file>0){
  17.             if($0~/^[[:space:]]*$/){
  18.                 print>folder"\\New_"file;
  19.             }else{
  20.                 for(i=1;i<=NF;i++){
  21.                     printf i<NF?"%.8e  ":"%.8e\n",map[i]==""?$i:$i/map[i]>folder"\\New_"file;
  22.                 }
  23.             }
  24.         }
  25.     }
  26. }
复制代码

TOP

本帖最后由 meiszp 于 2016-9-27 15:47 编辑

回复 2# pcl_test
恕我小白,请问第一行是要我安装gawk?第二行是让我在DOS窗口复制下面命令运行吗?
&cls&dir /a-d/b *.txt|gawk -f "%~f0"&pause&exit
有没有纯批的命令呢?谢谢!

TOP

本帖最后由 pcl_test 于 2018-4-12 15:08 编辑
  1. powershell -c "dir *.txt|?{$_ -is [IO.FileInfo]}|%%{gc $_|%%{$a=($_.trim() -split '\s+');('{0:e8} {1:e8} ' -f ($a[0]/10),($a[1]/20))+($a[2..($a.length-1)] -join ' ')}|out-file ('New_'+$_.name) -encoding default}"
  2. pause
复制代码

TOP

本帖最后由 523066680 于 2016-9-27 20:11 编辑

Perl,安装请咨询搜索引擎。
  1. open READ, "<:raw", "data.txt";
  2. my @divi = map { $_ * 10 } (1 .. 20);  #10 20 30 ... 200
  3. my $i;
  4. while ($e = <READ> )
  5. {
  6.     $e =~s/^\s+//;      #开头空格清除
  7.     $e =~s/\r?\n$//;    #换行符清除
  8.     $i = 0;
  9.     @arr =  map { $divi[$i++] * $_  } split(/\s+/, $e);
  10.     grep { printf("% e  ", $_) } @arr;
  11.     print "\n";
  12. }
  13. close READ;
复制代码
相比之下我这个有点肿,可能有些知识没掌握
输出结果没有验证过
  1. -6.705523e-006   9.132935e+006   2.069218e+006  -1.526766e+007   1.043421e+007  -2.945188e+007   2.172848e+007  
  2. 5.000000e-001   9.238625e+006   4.093383e+006  -1.436891e+007   1.036955e+007  -2.850440e+007   2.380366e+007  
  3. 9.999932e-001   9.967751e+006   7.828288e+006  -1.409941e+007   1.014586e+007  -2.763844e+007   2.568582e+007  
  4. 1.500000e+000   1.016323e+007   1.191119e+007  -1.432231e+007   9.860271e+006  -2.663541e+007   2.749764e+007  
  5. 1.999993e+000   9.631241e+006   1.518526e+007  -1.545164e+007   9.571748e+006  -2.537090e+007   2.923343e+007  
  6. 2.500000e+000   8.920181e+006   1.689968e+007  -1.754524e+007   9.413743e+006  -2.387482e+007   3.087182e+007  
  7. 2.999993e+000   8.686865e+006   1.620382e+007  -1.962749e+007   9.421916e+006  -2.225997e+007   3.236232e+007  
  8. 3.500000e+000   9.163929e+006   1.410576e+007  -2.072869e+007   9.521359e+006  -2.060406e+007   3.358839e+007  
  9. 3.999993e+000   9.702406e+006   1.152561e+007  -2.226319e+007   9.665547e+006  -1.895729e+007   3.468742e+007  
复制代码

TOP

本帖最后由 happy886rr 于 2016-9-28 22:41 编辑

回复 1# meiszp
纯批模拟科学计数法
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. (for /f "tokens=1,2,*" %%a in ('type test.txt') do (
  4. for /f "tokens=1,2 delims=e" %%A in ("%%a") do (
  5. set "str=%%B"
  6. if "!str:~0,1!"=="-" (
  7. set/a "str=1!str:~1!+1"&set "str=-!str:~-3!"
  8. ) else (
  9. if "!str!"=="+000"   (
  10. set "str=-001"
  11. ) else (
  12. set/a "str=1!str:~!-1"&set "str=+!str:~-3!"
  13. )
  14. )
  15. set "lie1=  %%Ae!str!"
  16. )
  17. for /f "tokens=1,2 delims=e" %%A in ("%%b") do (
  18. set "str=%%B"&set "ptr=%%A"&set "ptr=!ptr:.=!"
  19. if !ptr! geq 200000000 (set/a ptr/=2) else (set/a ptr=!ptr!0/2)
  20. if !ptr! geq 500000000 (set Mark=1) else (set Mark=0)
  21. if "!str:~0,1!"=="-" (
  22. set/a "str=1!str:~!+1+Mark"&set "str=-!str:~1!"
  23. ) else (
  24. if "!str!"=="+000"   (
  25. if !Mark! equ 1 (set "str=-001") else (set "str=-002")
  26. ) else (
  27. set/a "str=1!str:~1!-1-Mark"&set "str=+!str:~1!"
  28. )
  29. )
  30. set "lie2=  !ptr:~0,1!.!ptr:~1!e!str!"
  31. )
  32. echo !lie1:~-16! !lie2:~-16! %%c
  33. ))>new.txt
  34. start new.txt
  35. set/p=修改完毕!
复制代码

TOP

按CSV文件的格式存文件,保持格式统一。不要为了视觉对齐,用空格补全对齐文件内容。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

PowerShell
  1. $str = [IO.File]::ReadAllText('D:\Test\a.txt', [Text.Encoding]::Default);
  2. [regex]::Replace($str, '(?m)^(\s*\S+)', {param($m); ($m.Value/10).ToString('e8')})
复制代码

TOP

本帖最后由 pcl_test 于 2016-9-28 22:27 编辑

回复 4# pcl_test

大神,您好!您写的大代码我复制新建了个.bat文件运行,结果如下。多了一列,结果也不是我想要的。还有就是每列都要除以一个数字,比如共有20列,1列/1、2列/2、3列/3……20列/20。
1

评分人数

TOP

回复 5# 523066680

谢谢,小白还是喜欢纯批,不用安装其他东西。

TOP

回复 9# meiszp
把你测试的文本打包发上来看看

TOP

回复 11# pcl_test
不在自己的电脑上,我明天上传吧。麻烦大神了。

TOP

回复 6# happy886rr
谢谢!完全看不懂。在代码中看不出我要除的数字。您写的大代码我复制新建了个.bat文件运行,没有结果。

TOP

回复 8# WHY
谢谢!不过每列没有除以一个数。

TOP

本帖最后由 happy886rr 于 2016-9-28 22:39 编辑

回复 13# meiszp
没有结果那就对了,我只修改名字为test.txt的文件,对了,我还没有加pause。速度太快,结果一闪而过。已添加pause,请在原楼复制吧。

TOP

返回列表