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

[文本处理] [已解决]如何使用文本工具进行整行去重、首列排序

本帖最后由 77七 于 2023-6-5 13:25 编辑

请教各位老师、大佬:
如何使用gawk或sed或grep等专业文本处理工具  对文本进行以下处理
1.按整行进行去重(如 第一行、第三行相同,则去除第三行);
2.仅对第一列进行排序(第一列相同的所有行保持原有的上下顺序)

文本 编码ansi 数万行 含有多列(空格分隔) 含有数字、汉字、符号,不含引号、叹号;
批处理 编码ansi
如 1.txt
  1. 江苏 盐城
  2. 江苏 苏州 宿迁
  3. 浙江 杭州
  4. 江苏 南京
  5. 江苏 盐城
  6. 江苏 苏州
  7. 安徽 合肥
复制代码
20230605 13:25 重新修改 1.txt
  1. 浙江 杭州
  2. 江苏 盐城
  3. 江苏 苏州 宿迁
  4. 江苏 南京
  5. 江苏 盐城
  6. 江苏 苏州
  7. 安徽 合肥
复制代码


希望几秒内处理完成,结果直接覆盖,或者得到 2.txt
2.txt
20230605 13:19 修改
utf-8编码的1.txt sort排序及手动处理结果:
  1. 江苏 盐城
  2. 江苏 苏州 宿迁
  3. 江苏 南京
  4. 江苏 苏州
  5. 浙江 杭州
  6. 安徽 合肥
复制代码

ansi编码的1.txt sort排序及手动处理结果:
  1. 安徽 合肥
  2. 江苏 盐城
  3. 江苏 苏州 宿迁
  4. 江苏 南京
  5. 江苏 苏州
  6. 浙江 杭州
复制代码

如上,排序了江苏、浙江、安徽;去除了重复行(第二个 江苏 盐城);
江苏 盐城;江苏 苏州 宿迁;江苏 南京;江苏 苏州; 的上下顺序不变。

谢谢!
补充说明:
上述2.txt结果是我错误的对utf-8编码的1.txt经过sort排序后,手动加工形成的。
像江苏、浙江、安徽的上下顺序,不影响实际使用。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
bat小白,请多指教!谢谢!

回复 2# buyiyang


   谢谢大佬,测试正确,非常感谢!
bat小白,请多指教!谢谢!

TOP

回复 4# qixiaobin0715


   感谢大佬关注!因为文本是不断变化的,又是几万行,经常需要处理,就没有考虑纯批处理。现在试了一下,我发现了一个知识点,批处理的sort命令 对 1楼的文本保存为ansi 和utf-8 的排序结果居然是不一样的。
bat小白,请多指教!谢谢!

TOP

回复 5# terse


   感谢大佬帮助!测试结果正确。
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2023-6-5 12:17 编辑

回复 8# qixiaobin0715


   谢谢大佬,使用 http://www.bathome.net/redirect.php?goto=findpost&;ptid=12081&pid=76757 测试代码用时53分钟。这个耗时代码可能有点问题,结果少了一个0。文本有5万3千行。
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2023-6-5 17:12 编辑

回复 2# buyiyang


   大佬,能不能帮我再修改一下,实际使用中,我发现脚本没有对首列进行排序,仅仅是将首列相同的行排在了一起。
1楼的2.txt的结果,是我错误使用批处理的sort命令,对utf-8编码的1.txt排序了江苏、浙江、安徽后,手动调整第二列及以后列 顺序后形成的,和1.txt中的江苏、浙江、安徽行首次出现的上下顺序相同,属于巧合。如果sort ansi编码的1.txt文本,安徽是排在第一个的。
可能让您造成了一定程度的误解,不好意思。
我希望它们有某一种顺序就行,就像批处理中的 sort 排序utf-8 或ansi ,正逆序也都可以。


可能用数字描述更准确,实际使用中首列数字、汉字、字母都有。以下仅演示排序。
  1. 处理前
  2. 2 3
  3. 1 5
  4. 2 1
  5. 1 8
  6. 3 0
  7. 处理后
  8. 1 5
  9. 1 8
  10. 2 3
  11. 2 1
  12. 3 0
复制代码

谢谢大佬,terse大佬已经帮助我解决了问题。
bat小白,请多指教!谢谢!

TOP

回复 11# aloha20200628


   谢谢老师指点!gawk去重确实很好用,但是我主要是想解决首列排序的问题。
bat小白,请多指教!谢谢!

TOP

如果使用gawk去重,使用批处理排序首列,我的思路是这样的,将行号添加到第二列前面,然后sort “第一列行号第二列”,能排序首列,并且不改变首列相同行的上下顺序。只是一直 set 效率非常低。
  1. @echo off
  2. gawk "!existLines[$0]++" 1.txt>2.txt
  3. setlocal enabledelayedexpansion
  4. for /f "tokens=1-2* delims=: " %%a in ('type "2.txt" ^|findstr /n .*') do (
  5. echo %%a
  6. set n=00000000%%a
  7. set "#%%b#!n:~-7!=%%c"
  8. )
  9. (for /f "tokens=1-2* delims=#=" %%a in ('set # ^|sort') do (
  10. echo %%a %%c
  11. ))>3.txt
  12. endlocal
  13. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 14# qixiaobin0715


   实际文本也很简单,就两三列简短的数据,使用随机数可以创建一个类似的。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /l %%l in (1,1,50000) do (
  4. set n=!random!
  5. set m=!random!
  6. echo !n! !m!
  7. ))>1.txt
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2023-6-5 15:12 编辑

回复 16# terse


   

大佬,像以下这样的,数字比较好说明,汉字因为编码问题,排序有差异又出现巧合。实际文本是ansi,只要排序了就行,比如以下数字,可以排成 1 2 3 ,也可以 3 2 1 。
  1. 处理前
  2. 2 3
  3. 1 5
  4. 2 1
  5. 1 8
  6. 3 0
  7. 处理后
  8. 1 5
  9. 1 8
  10. 2 3
  11. 2 1
  12. 3 0
复制代码
bat小白,请多指教!谢谢!

TOP

回复 18# xczxczxcz


   谢谢大佬指点!注册账号以前没接触过计算机语言,包括现在我也不知道什么是对象语言...因为现在bat基本可以满足我的实际使用需要,还有很多第三方工具可以调用补充bat的不足,所以我的想法是把bat学好就行,自己实用为主,暂时不考虑学习ps。
bat小白,请多指教!谢谢!

TOP

回复 19# terse


   谢谢大佬,测试没问题,完全满足需求。批处理中的 sort 会按整行排序,排序第一列同时会排序第二列。我是想对第二列不排序,保持原有顺序。
大概是1楼,由于我的错误,和巧合,让您造成了误解,不好意思。描述起来可能比较困难,本意像13楼中我的批处理排序代码那样,第一列相同的,行号小的第二列会排在上面。
bat小白,请多指教!谢谢!

TOP

回复 22# terse

谢谢大佬!没有执着用批处理解决这个问题。这种写法学习了!测试了一下,用时12分钟。

我把代码中的去重去掉了,(因为还在set,在下午测试的时候我发现批处理set 到三四万个变量后,速度已经变得很慢 )。直接使用gawk去重,使用代码排序,耗时只需1分钟,效率已大大提高!
bat小白,请多指教!谢谢!

TOP

回复 24# WHY


   谢谢大佬!速度也很快,5万行文本,1-2秒左右。
bat小白,请多指教!谢谢!

TOP

回复 26# aloha20200628


   谢谢老师指点!我试了一下
  1. _sort -k 1 1.txt
复制代码


没有达到效果,仍然排序了第二列。
  1. 排序前
  2. 2 7
  3. 1 5
  4. 2 1
  5. 1 2
  6. 1 3
  7. 排序后
  8. 1 2
  9. 1 3
  10. 1 5
  11. 2 1
  12. 2 7
  13. 希望排序后
  14. 1 5
  15. 1 2
  16. 1 3
  17. 2 7
  18. 2 1
复制代码


看了sort -k的说明,我也没看明白。
-k, --key=POS1[,POS2] 在 POS1(起点 1)开始一个键,在 POS2 结束
(默认行尾)
bat小白,请多指教!谢谢!

TOP

返回列表