找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 141419|回复: 38

[文本处理] 如何删除文本中的指定字符串并反转/颠倒文本行顺序

[复制链接]
发表于 2018-11-13 17:05:07 | 显示全部楼层 |阅读模式
求批处理文本 数字内容 排列方法
文本内容1万行为纯数字  如图1
想把文本中 所有开头的20去掉  同时将 后面5位数字之间的空格去掉  实现图2效果
并能 倒过来排列
发表于 2018-11-13 19:35:17 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-7 delims= " %%i in (1.txt) do (
  3.   set "aa=%%i"
  4.   set aa=!aa:~2!
  5. echo !aa! %%j%%k%%l%%m%%n%%o>>2.txt
  6. )
  7. pause
复制代码
发表于 2018-11-13 20:16:55 | 显示全部楼层
  1. @set @n=0;/* & echo off

  2. dir /b *.txt|cscript -nologo -e:jscript "%~0" ""
  3. exit/b & rem */
  4. arg = WScript.Arguments(0);
  5. fso = new ActiveXObject("Scripting.FileSystemObject");
  6. while (!WSH.StdIn.AtEndOfStream) {
  7.     f = WSH.StdIn.ReadLine();
  8.     txt = fso.OpenTextFile(f,1).ReadAll();
  9.     txt = txt.replace(/^..(\d+ \d) (\d) (\d) (\d) (\d)/mg,"$1$2$3$4$5");
  10.     fso.OpenTextFile(f,2).Write(txt);
  11. }
复制代码
发表于 2018-11-13 21:25:56 | 显示全部楼层
回复 2# hlzj88
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-7" %%i in (1.txt) do (
  4.     set "aa=%%i"
  5.     echo !aa:~2! %%j%%k%%l%%m%%n%%o
  6. ))>2.txt
复制代码
一万行的文本不算小,建议把重定向放到for循环外面,提高执行效率。
发表于 2018-11-13 22:23:04 | 显示全部楼层
回复 4# Batcher

谢谢提醒,细节决定速度。
 楼主| 发表于 2018-11-13 22:42:08 | 显示全部楼层
回复 4# Batcher
感谢 各位大神指教  等下测试一下
 楼主| 发表于 2018-11-13 22:53:06 | 显示全部楼层
回复 4# Batcher
测试效果  速度很快 几秒 就好   再请教 如何  将 这1万行数字  倒过来重新排列呢
 楼主| 发表于 2018-11-13 23:14:26 | 显示全部楼层
回复 2# hlzj88
感谢指示  转换后的结果  如何能   从后而上  倒过来重新排列呢  谢谢
发表于 2018-11-14 00:48:19 | 显示全部楼层
回复 8# hqhlwz
  1. sort /r 1.txt /o 2.txt
复制代码
 楼主| 发表于 2018-11-14 14:11:32 | 显示全部楼层
回复 9# flashercs
如何整合到图片中的代码呢?
发表于 2018-11-14 18:19:22 | 显示全部楼层
本帖最后由 xczxczxcz 于 2018-11-14 18:26 编辑

几万行用纯P,一行行倒过来赋值给变量。速度估计个把小时。
下面的为 PowerShell 版。WIN7以上系统可用。PS3.0以上最好。
121440行。约12秒完成 修改并全部倒排。

  1. $StartTime= Get-date # 开始计时

  2. ((cat ".\00.txt") | %{
  3.         $str=$_ -replace "^20","" -replace "[\s]",""
  4.         $str.insert(10," ")
  5.         }
  6. ) | SC "$env:temp\ref.txt"
  7. $Total = (cat "$env:temp\ref.txt" -TotalCount -1).Count
  8. (Cat "$env:temp\ref.txt")[$Total..0] | SC ".\ok.txt"

  9. Ri "$env:temp\ref.txt" -force

  10. Write-host "共用时间:"([DateTime]::Now - $StartTime).TotalMilliseconds"毫秒" -Fore RED

  11. # 计时结束

  12. pause
复制代码
===========保存为 xxx.ps1  点右键用 windows powershell 运行。系统自带
-------------------------------------------------------------------------------------------------------

附上 纯P 供参考:

  1. @echo off & cd /d "%~dp0"
  2. echo %time%

  3. setlocal EnableDelayedExpansion
  4. for /f "tokens=1*" %%a in (00.txt) do (
  5.         set "aa=%%a"
  6.         set "bb=%%b"
  7.         set /a n+=1
  8.         set "str!n!=!aa:~2! !bb: =!"
  9.         rem echo !aa:~2! !bb: =!
  10. )

  11. (for /l %%e in (%n% -1 1) do echo !str%%e!)>final.txt

  12. echo %time%

  13. pause & exit
复制代码
注不要用 sort /r 它会按大小排序。
 楼主| 发表于 2018-11-14 19:10:22 | 显示全部楼层
回复 11# xczxczxcz
感谢你的提示 刚测试你的方法 用sort的方法 也测试了 结果是一样  但使用大神你的代码  转换过程有点慢
能否提高一下效率呢

附上 测试文件 下载地址http://data.917500.cn/cqssc_10000.txt
发表于 2018-11-14 19:49:18 | 显示全部楼层
回复 12# hqhlwz


    偶那个是倒排的。不是倒序排列。倒序是从大到小排列。若你的原始文档是从小到大排好的。那倒排和倒序是一样的。用 sort /r 当然快。若你的原始文本内容并不是从小到大排列,是乱序的。倒排和倒序就不一样了。偶写的是倒排。不管你原始顺序如何。都是按原文本从后到前排列。不会受字符大小的影响。看你的需求了。
发表于 2018-11-14 20:05:26 | 显示全部楼层
回复 12# hqhlwz

    针对你这个文本。全是从小到大的排序。当然简单了。

纯 P 约 2秒

  1. @echo off & cd /d "%~dp0"
  2. echo %time%

  3. setlocal EnableDelayedExpansion
  4. (for /f "tokens=1*" %%a in (00.txt) do (
  5.         set "aa=%%a"
  6.         set "bb=%%b"
  7.         echo !aa:~2! !bb: =!
  8. ))>%temp%\ref.txt
  9. sort /r "%temp%\ref.txt" /o final.txt
  10. del /q/f "%temp%\ref.txt"
  11. echo %time%

  12. pause
复制代码
=============================
纯 PS 约 0.6秒

  1. $StartTime= Get-date # 开始计时

  2. ((cat ".\00.txt") | sort -desc | %{
  3.         $str=$_ -replace "^20","" -replace "[\s]",""
  4.         $str.insert(10," ")
  5.         }
  6. ) | SC ".\ok.txt"

  7. $Time = [DateTime]::Now - $StartTime
  8. Write-host "共用时间:"$Time.Seconds"秒 "$Time.Milliseconds"毫秒" -Fore RED

  9. # 计时结束

  10. pause
复制代码
==============================
发表于 2018-11-14 21:09:38 | 显示全部楼层
本帖最后由 WHY 于 2018-11-16 19:50 编辑
  1. gawk "{a[NR]=substr($1,3)" "$2""$3""$4""$5""$6}END{for(i=NR;i>0;i--)print a[i]}" 1.txt > 2.txt
复制代码
  1. PowerShell "[Collections.ArrayList]$arr=[IO.File]::ReadAllLines('1.txt') -replace '^20|(?<!\d\d)\s';$arr.Reverse();sc 2.txt -Value $arr"
复制代码
  1. sort /r 1.txt | sed -r "s/^20|\s//g; s/[0-9]{5}$/ &/" > 2.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
smss + 1 你咋这么牛

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 03:29 , Processed in 0.036478 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表