无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4588|回复: 13
打印 上一主题 下一主题

[求助] 下列格式文本合并去重如何批处理实现?

[复制链接]
跳转到指定楼层
1#
发表于 2021-4-17 19:05:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
a.txt   aaa bbb ccc ddd eee
b.txt   ddd eee fff ggg hhh
合并为
c.txt   aaa bbb ccc ddd eee fff ggg hhh
2#
发表于 2021-4-17 19:43:55 | 只看该作者
  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字可能会出错,具体数字没试过。如果真有这么多内容,建议改大缓冲区试试。

点评

谢谢,成功了。 if /i "!var:%%b=!"=="!var!" set var=!var! %%b什么意思看不明白,能讲一下吗?  详情 回复 发表于 2021-4-17 21:42
回复

使用道具 举报

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

谢谢,成功了。
if /i "!var:%%b=!"=="!var!" set var=!var! %%b什么意思看不明白,能讲一下吗?

点评

"!var:%%b=!"意思就是从变量var中删除%%b,如果删除后的变量等于原变量,则%%b不在变量var中,此时,将var本身加空格和%%b赋值给var。 set /?了解详情 由于批处理没有一般编程语言判断字符是否在列表中这样的  详情 回复 发表于 2021-4-17 22:30
回复

使用道具 举报

4#
发表于 2021-4-17 22:08:12 | 只看该作者
高手, 比高家庄还高.
回复

使用道具 举报

5#
发表于 2021-4-17 22:30:06 | 只看该作者
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
复制代码

点评

非常感谢!我是想把这两个文件合并,用这个法合并好好像不对啊  详情 回复 发表于 2021-4-17 22:42
回复

使用道具 举报

6#
发表于 2021-4-17 22:34:05 | 只看该作者
这个是很久之前学的时候从网上搜的,set命令用法。

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

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

回复

使用道具 举报

7#
 楼主| 发表于 2021-4-17 22:42:39 | 只看该作者
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

回复

使用道具 举报

8#
发表于 2021-4-17 23:19:33 | 只看该作者
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
复制代码

点评

谢谢回复,测试好像没有合并后去重啊。  详情 回复 发表于 2021-4-18 08:03
回复

使用道具 举报

9#
 楼主| 发表于 2021-4-18 08:03:19 | 只看该作者

谢谢回复,测试好像没有合并后去重啊。

点评

原因在于变量长度太长,你这个b.txt已经1万多字了,即使for 中的变量%%A之类也受此限制,说明像这种1行几万字的无法用此种方法分析。 这几天手不太舒服,不想敲长长的代码,DP盘符整理更新也暂停了,你试试楼上的  详情 回复 发表于 2021-4-18 11:21
回复

使用道具 举报

10#
发表于 2021-4-18 09:10:34 | 只看该作者
本帖最后由 黑中见白 于 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
回复

使用道具 举报

11#
发表于 2021-4-18 11:21:55 | 只看该作者
Fdh6585001 发表于 2021-4-18 08:03
谢谢回复,测试好像没有合并后去重啊。

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

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

不知道你这是不是折腾PE之类的文件列表,如果是,其实有更简单的方法,不用管文件重复否,一行一个文件名,用命令复制时不覆盖就好。。。

点评

多谢指教  详情 回复 发表于 2021-4-18 12:55
回复

使用道具 举报

12#
 楼主| 发表于 2021-4-18 12:55:09 | 只看该作者
nttwqz 发表于 2021-4-18 11:21
原因在于变量长度太长,你这个b.txt已经1万多字了,即使for 中的变量%%A之类也受此限制,说明像这种1行几 ...

多谢指教
回复

使用道具 举报

13#
 楼主| 发表于 2021-4-18 13:37:04 | 只看该作者
这个错在哪?

@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
回复

使用道具 举报

14#
发表于 2021-4-20 21:43:54 | 只看该作者
学习了,谢谢
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-17 05:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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