标题: [问题求助] PowerShell怎样根据区域字段重复去重复行? [打印本页]
作者: 娜美 时间: 2023-8-1 09:30 标题: PowerShell怎样根据区域字段重复去重复行?
本帖最后由 娜美 于 2023-8-3 14:46 编辑
Get-Content 1.txt | sort -Unique -k4 -k5 | sc 2.txt
根据区域字段重复,去重复行, 这样写似乎不对, 请帮忙指正一下- 1 2 3 4
- 1 2 3 4 5
- 1 2 4 0
复制代码
8/3 14:33补充
根据列数的字段是否为重复 空格为分隔符 例如如果第3 and 4列字段重复了 只要其中任意一行就行
out.txt
1 2 3 4 5
1 2 4 0
作者: Batcher 时间: 2023-8-1 09:43
回复 1# 娜美
操作之前是怎样的,操作之后变成啥样?
作者: 娜美 时间: 2023-8-1 12:24
回复 2# Batcher
应该是这样吧
out.txt
1 2 3 4 5
1 2 4 0
作者: Nsqs 时间: 2023-8-3 12:52
本帖最后由 Nsqs 于 2023-8-3 13:00 编辑
不保留1234而保留12345吗?有没有规则之类的?
如果没有的话- $text=
- '1 2 3 4
- 1 2 3 4 5
- 1 2 4 0'
- $str=$text -split '\r\n'
- $str|?{[regex]::Matches($text,$_).count -eq 1}
复制代码
作者: Five66 时间: 2023-8-3 13:12
看不懂,你得说下
1 2 3 4
1 2 3 4 5
那里重复了,是如何重复的
(我只知道1 2 3 4 5去掉 5就是1 2 3 4)
作者: 娜美 时间: 2023-8-3 13:24
本帖最后由 娜美 于 2023-8-3 13:34 编辑
回复 5# Five66
根据列数 例如第3 and 4列字段重复了
2 5 6 3 7
0 4 6 3 9
7 9 6 5 5
4 6 2 3 4
out.txt
0 4 6 3 9
7 9 6 5 5
4 6 2 3 4
作者: 娜美 时间: 2023-8-3 13:31
回复 4# Nsqs
嗯结果是对, 但不过为什么要比awk写得更复杂呢, awk '!a[$3,$4]++' 就不能写出比awk更简化的吗
作者: Nsqs 时间: 2023-8-3 13:35
回复 7# 娜美
你要觉得awk好,那你就用awk啊,这是PowerShell
作者: Nsqs 时间: 2023-8-3 13:42
- $text=
- '1 2 3 4
- 1 2 3 4 5
- 1 2 4 0'
- $text -split '\r\n'|?{[regex]::Matches($text,$_).count -eq 1}
复制代码
另外你要是觉得你有最优解,你可以自己自给自足,在PowerShell区发帖的目的是什么?学习?想学PowerShell,态度就这样?你是哪里觉得代码很复杂?这核心就一句话解决的事,你自己看一下你一楼自己写的是什么玩意?牛头不对马嘴,就这样吧,PowerShell不适合你.这么怕麻烦的话
作者: pd1 时间: 2023-8-3 13:52
回复 7# 娜美
假如一个功能需要10万行代码来实现,你把10万行封装成一个dll,其他程序来调用,一行代码就解决了。
你觉得这个用一行代码就叫简洁吗?
作者: 娜美 时间: 2023-8-3 14:32
本帖最后由 娜美 于 2023-8-3 14:45 编辑
回复 9# Nsqs
好 好 好 好哥哥 不需要过度紧张嘛 如果1楼不够清楚, 不能理解透彻 那我补充一下
作者: Five66 时间: 2023-8-3 14:48
假设第三列都存在,根据第三列去重并排序(去重时仅保留最先读取的那一行)
[code]
Get-Content 1.txt | sort -unique {$_.split(' ')[2]} | sc 2.txt
[code]
$_.split(' ')[2]就是第三列,需要多列时加几个数字拼接一下其他列就行了(去重时仅保留最先读取的那一行,而且结果还会排序)
作者: xczxczxcz 时间: 2023-8-3 14:50
回复 4# Nsqs
还别说,虽然你的结果‘碰巧’对了(因一楼随手复制粘贴的东本不能体现出真实问题),
但与一楼的要求有出入,一楼是按照 第4列和第5列来判断(一楼的脚本虽然不正确,但意思应该是这个意思)是否已出现过,你的解法是按照整行判断的。
再修改一下就可以了。
作者: 娜美 时间: 2023-8-3 16:09
本帖最后由 娜美 于 2023-8-3 16:19 编辑
回复 12# Five66
哥哥你这个理解能力就很好嘛, 但为什么这样就不行了呢
Get-Content 1.txt | sort -unique {$_.split(' ')[1,2]} | sc 2.txt复制代码
作者: Five66 时间: 2023-8-3 17:34
回复 14# 娜美
$_.split(' ')是按单个空格切分每一行,不是单个空格的就换成其他的字符串
$_.split(' ')[1,2]结果是个数组,数组之间有特有的排序规则(也可能没有),总之将其转成字符串就比较好让人理解了- Get-Content 1.txt | sort -unique {$_.split(' ')[1,2] -join ''} | sc 2.txt
复制代码
去重时仅保留最先读取的那一行,而且结果还会排序
作者: 娜美 时间: 2023-8-3 18:31
本帖最后由 娜美 于 2023-8-3 18:33 编辑
回复 15# Five66
1 2 3
1 0 3
1 2 3
Get-Content 1.txt | sort -unique {$_.split(' ')[1,2] -join ''} | sc 2.txt
执行后结果少了一行
1 2 3
不是应该得到吗,
1 2 3
1 0 3
作者: Five66 时间: 2023-8-3 18:48
本帖最后由 Five66 于 2023-8-3 18:51 编辑
回复 16# 娜美
1.txt的分割符是三个空格吧- Get-Content 1.txt | sort -unique {($_ -split ' ')[1,2] -join ''} | sc 2.txt
复制代码
作者: Five66 时间: 2023-8-3 18:56
最先读取是指去重时最先读取的,去重一般是在排序完之后进行的
其实完全可以像awk那用ps的哈希或列表去重,不过代码会比较长
作者: 娜美 时间: 2023-8-3 19:04
回复 18# Five66
明白了 谢谢哥哥
作者: Five66 时间: 2023-8-3 20:57
还有种不进行排序的,可能更快更直观更自由点- Get-Content 1.txt | group {($_ -split ' ')[1,2] -join ''} | %{$_.group[0]} | sc 2.txt
复制代码
作者: 娜美 时间: 2023-8-3 21:15
还有种不进行排序的,可能更快更直观更自由点
Five66 发表于 2023-8-3 20:57
嗯嗯, 如果要在最末尾行再留空一行或2行呢
作者: Five66 时间: 2023-8-3 22:00
本帖最后由 Five66 于 2023-8-3 22:02 编辑
回复 21# 娜美
再加上一行命令
cmd /c "echo.>>2.txt"
作者: 娜美 时间: 2023-8-3 22:14
本帖最后由 娜美 于 2023-8-3 22:22 编辑
回复 22# Five66
Get-Content 1.txt | sort -unique {($_ -split ' ')[1,2] -join ''} | cmd /c "echo.>>2.txt"这样不行的
作者: Five66 时间: 2023-8-3 23:20
回复 23# 娜美
两行- Get-Content 1.txt | group-object {($_ -split ' ')[1,2] -join ''} | %{$_.group[0]} | sc 2.txt
- cmd /c "echo.>>2.txt"
复制代码
一行- (Get-Content 1.txt | group-object {($_ -split ' ')[1,2] -join ''} | %{$_.group[0]} | sc 2.txt);cmd /c "echo.>>2.txt"
复制代码
作者: 娜美 时间: 2023-8-4 11:08
本帖最后由 娜美 于 2023-8-4 16:56 编辑
回复 24# Five66
谢谢哥哥指点
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |