无忧启动论坛

标题: 下列格式文本合并去重如何批处理实现? [打印本页]

作者: Fdh6585001    时间: 2021-4-17 19:05
标题: 下列格式文本合并去重如何批处理实现?
a.txt   aaa bbb ccc ddd eee
b.txt   ddd eee fff ggg hhh
合并为
c.txt   aaa bbb ccc ddd eee fff ggg hhh
作者: nttwqz    时间: 2021-4-17 19:43
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. pushd %~dp0

  4. for /f "delims=" %%a in (
  5.     a.txt
  6.     b.txt
  7. ) do (
  8.     for %%b in (%%a) do (
  9.         if defined var (
  10.             if /i "!var:%%b=!"=="!var!" set var=!var! %%b
  11.         ) else (
  12.             set var=%%b
  13.         )
  14.     )
  15. )
  16. echo;!var!>c.txt
  17. pause
复制代码


由于变量的长度有限制,超过8189字可能会出错,具体数字没试过。如果真有这么多内容,建议改大缓冲区试试。
作者: Fdh6585001    时间: 2021-4-17 21:42
nttwqz 发表于 2021-4-17 19:43
由于变量的长度有限制,超过8189字可能会出错,具体数字没试过。如果真有这么多内容,建议改大缓冲区试 ...

谢谢,成功了。
if /i "!var:%%b=!"=="!var!" set var=!var! %%b什么意思看不明白,能讲一下吗?
作者: vaf    时间: 2021-4-17 22:08
高手, 比高家庄还高.
作者: nttwqz    时间: 2021-4-17 22:30
Fdh6585001 发表于 2021-4-17 21:42
谢谢,成功了。
if /i "!var:%%b=!"=="!var!" set var=!var! %%b什么意思看不明白,能讲一下吗?

"!var:%%b=!"意思就是从变量var中删除%%b,如果删除后的变量等于原变量,则%%b不在变量var中,此时,将var本身加空格和%%b赋值给var。

set /?了解详情

由于批处理没有一般编程语言判断字符是否在列表中这样的功能,这个是实现的方法之一。
python是这样的:
  1. str = ["aaa", "bbb", "ccc"]
  2. if "aaa" in str:
  3.   print('OK')
  4. # 结果:OK
复制代码

作者: nttwqz    时间: 2021-4-17 22:34
这个是很久之前学的时候从网上搜的,set命令用法。

set命令字符替换演示.7z

1.11 KB, 下载次数: 8, 下载积分: 无忧币 -2


作者: Fdh6585001    时间: 2021-4-17 22:42
nttwqz 发表于 2021-4-17 22:30
"!var:%%b=!"意思就是从变量var中删除%%b,如果删除后的变量等于原变量,则%%b不在变量var中,此时,将va ...

非常感谢!我是想把这两个文件合并,用这个法合并好好像不对啊 a.txt (7.59 KB, 下载次数: 7)



b.txt

14.22 KB, 下载次数: 6, 下载积分: 无忧币 -2


作者: nttwqz    时间: 2021-4-17 23:19
Fdh6585001 发表于 2021-4-17 22:42
非常感谢!我是想把这两个文件合并,用这个法合并好好像不对啊
  1. (for /f "delims=" %%a in (a.txt b.txt) do for %%b in (%%a) do findstr /i "%%b" c.txt 2>nul||set /p =%%b <nul)>c.txt
复制代码

作者: Fdh6585001    时间: 2021-4-18 08:03
nttwqz 发表于 2021-4-17 23:19

谢谢回复,测试好像没有合并后去重啊。
作者: 黑中见白    时间: 2021-4-18 09:10
本帖最后由 黑中见白 于 2021-4-18 09:25 编辑



<# :
@powershell "icm ([scriptblock]::Create((gc '%~f0' -Raw -Encoding UTF8)))"
exit
#>
# powershell script
#合并txt
$LINE = Split-Path  -Path .\ -Leaf
$files = Get-Childitem -Recurse -Include *.TXT
foreach ($file in $files)   #遍历文件
{
$content = get-content $file.pspath
add-content -Path "$LINE.txt" -Value  $content #附件内容到原文件
}
Write-Host -ForegroundColor White ('powershell命令_hash快速txt去重')
# $files = Get-Childitem -Recurse -Include *.txt #包括子目录txt
$files = Get-Childitem  -Path .\* -Include *.txt #当前目录txt
foreach ($file in $files)   #遍历文件
{
Write-Host -ForegroundColor White ($file.pspath)
[System.Collections.Generic.HashSet[string]]$lines=Get-Content $file -ReadCount 0
$lines=$lines| sort-Object #sort 排序
Set-Content  -Path $file -Value ($lines -join "`r`n")
}
Write-Host -ForegroundColor White ('成功')
Start-Sleep -Milliseconds 1000

作者: nttwqz    时间: 2021-4-18 11:21
Fdh6585001 发表于 2021-4-18 08:03
谢谢回复,测试好像没有合并后去重啊。

原因在于变量长度太长,你这个b.txt已经1万多字了,即使for 中的变量%%A之类也受此限制,说明像这种1行几万字的无法用此种方法分析。

这几天手不太舒服,不想敲长长的代码,DP盘符整理更新也暂停了,你试试楼上的方案或自己研究下。

不知道你这是不是折腾PE之类的文件列表,如果是,其实有更简单的方法,不用管文件重复否,一行一个文件名,用命令复制时不覆盖就好。。。
作者: Fdh6585001    时间: 2021-4-18 12:55
nttwqz 发表于 2021-4-18 11:21
原因在于变量长度太长,你这个b.txt已经1万多字了,即使for 中的变量%%A之类也受此限制,说明像这种1行几 ...

多谢指教
作者: Fdh6585001    时间: 2021-4-18 13:37
这个错在哪?

@echo off
for /f %%a in (a.txt) do (
        for /f %%b in (b.txt) do (if /i %%b equ %%a echo %%b>>c.txt)
    if /i %%a equ %%b echo %%a>>c.txt
)
echo a.txt与b.txt重复内容如下:
pause>nul|type c.txt
作者: cxincn    时间: 2021-4-20 21:43
学习了,谢谢




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3