批处理之家's Archiver

13545876873 发表于 2022-5-20 10:10

批处理根据a文件夹里文件名两个位置之间的字符,剪切到b文件夹相同字符的子文件夹

根据a文件夹里文件名两个位置之间的字符,把文件剪切到b文件夹相同字符的子文件夹里啊

我的D盘里有两个文件夹:基因合成和测序结果;
            测序结果文件夹里有很多文件,比如:[K3746-5001-1-26-PUC57]M13-48_B03 ;  [K3746-5001-25-48-PUC57]M13-48_B03;
                                                           [T4567-5003-25-48-PUC57]M13-47_C03 ;     [V2001-5002-25-48-PUC57]M13-47_C03
           基因合成文件夹里有子文件夹,子文件夹里又有文件夹5001    5002    5003    5004等等。
           我想把测序结果文件夹里的文件,根据名字的第8-11个字符,分别是:   5001   5001   5003   5002,把相应的文件剪切到基因合成子 子相应文件夹里。
  求大神教我啊:'( :'( :'( :'(

13545876873 发表于 2022-5-20 10:15

测序结果文件夹里的文件格式是ab1  :[K3746-5001-25-48-PUC57]M13-47_C03.ab1

qixiaobin0715 发表于 2022-5-20 10:22

最好提供一下基因合成文件夹的结构:tree一下发上来。

Batcher 发表于 2022-5-20 11:30

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255867&ptid=62784]4#[/url] [i]13545876873[/i] [/b]


推荐使用 tree 或 tree /f 命令说明你的文件夹结构,参考教程:
[url]http://bbs.bathome.net/thread-2514-1-1.html[/url]

Q-07:怎样把CMD窗口里的结果复制出来?
[url]http://bbs.bathome.net/thread-3473-1-1.html[/url]

如果需要上传截图,可以找个图床,例如:
[url]http://bbs.bathome.net/thread-60985-1-1.html[/url]

13545876873 发表于 2022-5-20 13:07

[img]https://s1.ax1x.com/2022/05/20/OLyNKe.png[/img]

qixiaobin0715 发表于 2022-5-20 13:43

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255873&ptid=62784]10#[/url] [i]13545876873[/i] [/b]
将下面代码保存为ANSI编码:[code]@echo off
cd /d "D:\基因合成\2022.5\"
for /d %%i in (*) do (
    move "D:\测序结果\*-%%i-*.ab1" "%%i\"
)
pause[/code]

yakeyun 发表于 2022-5-20 13:55

[i=s] 本帖最后由 yakeyun 于 2022-5-20 14:07 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255861&ptid=62784]1#[/url] [i]13545876873[/i] [/b]

贴主要表达的意思:
D盘存在如下两个目录:
D:\基因合成\2022.5
                              \5001\
                              \5002\
                              \5003\
D:\测序结果
                  \[K3746-5001-1-26-PUC57]M13-48_B03.ab1
                  \[K3746-5001-25-48-PUC57]M13-48_B03.ab1
                  \[T4567-5003-25-48-PUC57]M13-47_C03.ab1
                  \[V2001-5002-25-48-PUC57]M13-47_C03.ab1

需求读取D:\测序结果目录中的文件,根据5001、5002、5003字段分类文件,然后移动到D:\基因合成\2022.5\目录下对应字段文件夹中。

另存为ANSI格式,不然中文目录不会被识别。[code]@echo off&setlocal enabledelayedexpansion
for /f %%a in ('dir /a /s /b "D:\测序结果\*.ab1"') do (
set dvn=%%a
for /f "tokens=2 delims=[]" %%b in ("!dvn!") do (
for /f "tokens=2 delims=-" %%c in ("%%b") do (
set mls=%%c
set Ns=%date:~0,4%
set Ys=%date:~5,2%
if !Ys!==01 (set "Ys=!Ys:01=1!")
if !Ys!==02 (set "Ys=!Ys:02=2!")
if !Ys!==03 (set "Ys=!Ys:03=3!")
if !Ys!==04 (set "Ys=!Ys:04=4!")
if !Ys!==05 (set "Ys=!Ys:05=5!")
if !Ys!==06 (set "Ys=!Ys:06=6!")
if !Ys!==07 (set "Ys=!Ys:07=7!")
if !Ys!==08 (set "Ys=!Ys:08=8!")
if !Ys!==09 (set "Ys=!Ys:09=9!")
set "today=!Ns!.!Ys!"
if exist D:\基因合成\!today!\!mls! (move /y "!dvn!" "D:\基因合成\!today!\!mls!" >nul) else (
md "D:\基因合成\!today!"
md "D:\基因合成\!today!\!mls!"
move /y "!dvn!" "D:\基因合成\!today!\!mls!" >nul
)
)
)
)
exit[/code]

qixiaobin0715 发表于 2022-5-20 14:41

[i=s] 本帖最后由 qixiaobin0715 于 2022-5-20 14:42 编辑 [/i]

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255873&ptid=62784]10#[/url] [i]13545876873[/i] [/b]
这样也行:[code]@echo off
cd /d "D:\测序结果"
for /f "tokens=1-2* delims=-" %%a in ('dir /b /a-d *.ab1') do (
    if not exist "D:\基因合成\2022.5\%%b" md "D:\基因合成\2022.5\%%b"
    move "%%a-%%b-%%c" "D:\基因合成\2022.5\%%b\"
)
pause[/code]

13545876873 发表于 2022-5-20 15:11

谢谢大哥们的帮助,这个问题已经解决:lol
我还有个问题:   比如在我把[G3005-5001-11-24-PUC57]M13-48_B03.ab1    剪切到5001文件夹里后。  
                   5001文件夹里有一个htm文件(如图片所示)   ,   我要怎么把htm里  11-24的的序列提取出来,并新建一个5001-11-24的文本,把这个序列粘贴进去。   同时新建一个5001的文本,把5001全序列粘贴进去啊:) :'( :'(

[img]https://s1.ax1x.com/2022/05/20/OLjZRK.png[/img]

13545876873 发表于 2022-5-20 15:48

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255876&ptid=62784]13#[/url] [i]qixiaobin0715[/i] [/b]
大哥,这个运行很好:)
能教教我另外一个难题,怎么从HTM里提取相应的序列吗。   每天重复太多了:'( :'( :'(

qixiaobin0715 发表于 2022-5-20 16:00

你把之前5001文件夹和处理后文件夹要达到的效果发到网盘上共享,我可以试试看。

yakeyun 发表于 2022-5-20 17:06

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255879&ptid=62784]15#[/url] [i]13545876873[/i] [/b]


条件本身就冲突,没办法操作。5001存在2个文档,取值会出错。

13545876873 发表于 2022-5-20 19:06

:'( :'( :'( [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255890&ptid=62784]18#[/url] [i]yakeyun[/i] [/b]

xczxczxcz 发表于 2022-5-21 07:21

传百度阿里糸估计很多人不会点。蓝奏才方便,123次之。

13545876873 发表于 2022-5-21 07:48

大哥:)   [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255882&ptid=62784]17#[/url] [i]qixiaobin0715[/i] [/b]



蓝奏链接   https://wwn.lanzoub.com/iV6li056n7cj

qixiaobin0715 发表于 2022-5-21 09:55

没看太明白:
1.1-14、1-26、25-38、25-52是如何对应的;
2.用记事本打开htm文件后,你所说的序列行有何特点,如何就确定这行就是你所要的。

13545876873 发表于 2022-5-21 10:36

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255908&ptid=62784]26#[/url] [i]qixiaobin0715[/i] [/b]



htm文件不是用记事本打开哈,就用网页打开。[img]https://s3.bmp.ovh/imgs/2022/05/21/7b4e9b1a4a787a30.png[/img]

13545876873 发表于 2022-5-21 10:37

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255908&ptid=62784]26#[/url] [i]qixiaobin0715[/i] [/b]


    [img]https://s1.ax1x.com/2022/05/21/OX5VFU.md.png[/img]

13545876873 发表于 2022-5-21 11:00

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255908&ptid=62784]26#[/url] [i]qixiaobin0715[/i] [/b]




[img]https://s1.ax1x.com/2022/05/21/OXoE24.md.png[/img]

13545876873 发表于 2022-5-21 11:09

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255908&ptid=62784]26#[/url] [i]qixiaobin0715[/i] [/b]


比如
5001-1-14就是第一行:第1个字母到 第572个的全部 字母;       在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-1-14的文本,并把这段字母复制进去
5001-1-26就是第一行:第1个字母到 第1064个的全部 字母;     在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-1-26的文本,并把这段字母复制进去
5001-25-38就是第一行:第972个字母到 第1550个的全部 字母;      在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-25-38的文本,并把这段字母复制进去
5001-25-52就是第一行:第972个字母到 第2138个的全部 字母          在把文件从测序结果剪切到相应文件夹之后,同时新建一个5001-25-52的文本,并把这段字母复制进去
5001就是第一行:第1个字母到 第2138个的全部 字母   ;                         最后同时新建一个5001的文本,把第一行全部字母复制进去

yakeyun 发表于 2022-5-22 18:02

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255914&ptid=62784]22#[/url] [i]13545876873[/i] [/b]

代码备份留存,如果单纯的只需要提取11~24行信息,可以用下面的代码,但是你的文件没有规律,且文件用记事本打开一行的内容太长了,最主要的是要你自己明白这个文件和其它文件是否有规律,比如字符位置是否固定等等。[code]@echo off&setlocal enabledelayedexpansion
set today=2022.5
set mls=5001
set txts=5001-11-24
for /f %%d in ('dir /a /s /b "D:\基因合成\!today!\!mls!\*.htm"') do (
for /f "skip=10 tokens=*" %%e in (%%d) do (
set op=%%e
set /a m+=1
if !m! LEQ 14 (
echo !op!
)
)
) >D:\基因合成\!today!\!mls!\!txts!.txt
(
for /f %%i in ('type D:\基因合成\!today!\!mls!\!txts!.txt') do (
echo %%i
)
)>D:\基因合成\!today!\!mls!\!mls!.txt
exit[/code]

13545876873 发表于 2022-5-22 18:23

大哥   [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255952&ptid=62784]23#[/url] [i]yakeyun[/i] [/b]
你的这个5001-11-24我运行出来是这样的[img]https://s1.ax1x.com/2022/05/22/Oz96rn.png[/img]
不是我想要的结果哈:'( ;
比如5001-11-24,我想要的是5001-11(397:451)的首(第397个字母),
                                     到5001-24(934:988)的尾(第988个字母),之间的所有字母(文档里只要这些字母,其他的字母符号都不要)

这个是根据从测序结果文件夹里,剪切到基因合成文件夹里的ab1格式文件,的名字来选的哈(红框框处)[img]https://s1.ax1x.com/2022/05/22/OzC0dx.png[/img]

我想要所有从测序结果文件夹里,剪切到基因合成文件夹里的ab1格式文件,都会根据名字上的红框框处,自动生成一个txt文档(并把这两个数字之间的字母复制进去)

yakeyun 发表于 2022-5-22 22:16

[i=s] 本帖最后由 yakeyun 于 2022-5-22 23:26 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255953&ptid=62784]24#[/url] [i]13545876873[/i] [/b]
你这个获取的结果已经很明显了,说明html文件并不是TXT文件里面的行内容,需要你自己找一下规律,然后根据规律来截取。
比如第十行有数据,那么第十行的第几个到第几个是固定字符,或者字符被特殊字符夹在中间等。只有有规律的文本才能被批处理。

比如我帮你找出来的规律,你的5001.txt序列文件,可以用我上面发的代码获取到,不过代码要改成下面这个。
从取值可以看到,所有类容都是一行显示,为了发现规律,我故意将前面“><span”后面的字符分行。那么剩下的规律就是将取值进行赋值,
比如获取到的“5001-11-24.txt”文本,除了文件头和文件尾没有规律,中间部分全部都是规律字符,只需要将结果做4次替换,就可以取到正确结果。[code]@echo off&setlocal enabledelayedexpansion
set txts=5001-11-24
for /f %%d in ('dir /a /s /b ".\*.htm"') do (
for /f "skip=9 tokens=*" %%e in (%%d) do (
set op=%%e
set /a m+=1
if !m! LEQ 1 (
echo !op!
)
)
) >.\!txts!.txt[/code][img=690,653]https://s1.ax1x.com/2022/05/22/Oz5AfK.png[/img]


通过替换法测试发现,提取后的文本,只需要再次替换下面4处文本即可:

<tr><td>5'--&gt;3'</td><td style="color:silver">
<span style="color:red;">
</span>
</td></tr>

13545876873 发表于 2022-5-23 08:16

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255959&ptid=62784]25#[/url] [i]yakeyun[/i] [/b]

大哥,htm的规律是这样的哈:  [img]https://s1.ax1x.com/2022/05/23/XSKVdU.png[/img]

xczxczxcz 发表于 2022-5-23 10:12

给你一个WIN10的吧,至少PS>4.0
要保存哪些文件自行按格式修改, 脚本保存为 xxx.ps1[code]
$html = gc '.\5001.htm' -Raw -Encoding UTF8;

$oligos_arr=[regex]::Matches($html, '(?i)(?<=<tr><td>oligos.*?style.*?>)[^<]+').value.Foreach{
        ($_.Trim('|') -replace '&nbsp;|[@\(+\)]' -split '\|').Foreach{
                $e=$_.split(':');
                @{ID=$e[0].Trim('-'); begin=[int]$e[1]; end=[int]$e[2]; }
        }
}

$_5gt3=[regex]::Match($html, "(?<=5'--&gt;3'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';
#$_3lt5=[regex]::Match($html, "(?<=3'&lt;--5'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';

<# 5000-1-14 ... #>
('5001-1-14','5001-1-26','5001-25-38','5001-25-52').ForEach{
        $arr=$_.split('-');
        $index1=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[1]);
        $index2=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[2]);

        if($index1 -ne -1 -and $index2 -ne -1){
                [int]$t1=$oligos_arr[$index1].begin - 1;
                [int]$t2=$oligos_arr[$index2].end - 1;
                sc ".\$_.log" -Value (-join($_5gt3[$t1..$t2])) -Force -Verbose -NoNewline;
        }
}

[Console]::Write("全部完成 按任意键退出");
[void][Console]::ReadKey();
[/code]

qixiaobin0715 发表于 2022-5-23 14:36

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255914&ptid=62784]22#[/url] [i]13545876873[/i] [/b]
你先看一下6楼代码能完成先前的需求吗?

13545876873 发表于 2022-5-23 15:56

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255959&ptid=62784]25#[/url] [i]yakeyun[/i] [/b]
大哥,你的意思是这样的吧[img]https://s1.ax1x.com/2022/05/23/Xp8Br9.png[/img]
但这不是我想要的呀:'(
你这个方法最后把<tr><td>5'--&gt;3'</td><td style="color:silver">这些字符删除后,文本里就是5001的全部的2138个字母;然后我再去手动查找截取,,,那也可以直接再htm文件里复制粘贴到txt里了啊:'(
                      <span style="color:red;">
                      </span>
                     </td></tr>

我想要的是能不能:我测序结果文件夹里有很多ab1文件:[K3746-5001-1-26-PUC57]M13-48_B03 ;  [K3746-5001-25-48-PUC57]M13-48_B03;
                                                                         [T4567-5003-25-48-PUC57]M13-47_C03 ;     [V2001-5002-25-48-PUC57]M13-47_C03 等等
                                                                     第一步: 在我用一个bat把这些ab1文件剪切到相应的基因合成文件夹5001,5001,5003,5002等等里后,每个文件夹里已经有一个相应的htm文件:5001.htm,5001.htm,5003.htm,5002.htm等等
   第二步:在这些ab1文件被剪切进去后,相应的文件夹根据下面图片红框框处,自动生成一个txt文档(并把这两个数字之间的字母复制进去)[url=https://imgtu.com/i/XpY3bd][img]https://s1.ax1x.com/2022/05/23/XpY3bd.png[/img][/url

:'( :'( :'(

13545876873 发表于 2022-5-23 16:01

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255965&ptid=62784]27#[/url] [i]xczxczxcz[/i] [/b]


大哥,你这个要保存什么,的自己修改,那我有很多文件夹:5002,5003。。。。5100       那和直接在htm上复制粘贴没啥区别了呀:'( :'(

yakeyun 发表于 2022-5-23 21:35

[i=s] 本帖最后由 yakeyun 于 2022-5-23 21:40 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255986&ptid=62784]30#[/url] [i]13545876873[/i] [/b]

把27楼代码保存为MyScript.ps1:[code]$html = gc '.\5001.htm' -Raw -Encoding UTF8;

$oligos_arr=[regex]::Matches($html, '(?i)(?<=<tr><td>oligos.*?style.*?>)[^<]+').value.Foreach{
        ($_.Trim('|') -replace '&nbsp;|[@\(+\)]' -split '\|').Foreach{
                $e=$_.split(':');
                @{ID=$e[0].Trim('-'); begin=[int]$e[1]; end=[int]$e[2]; }
        }
}

$_5gt3=[regex]::Match($html, "(?<=5'--&gt;3'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';
#$_3lt5=[regex]::Match($html, "(?<=3'&lt;--5'.*?style.*?>).*?(?=</td>)").value -replace '<.*?>';

<# 5000-1-14 ... #>
('5001-1-14','5001-1-26','5001-25-38','5001-25-52').ForEach{
        $arr=$_.split('-');
        $index1=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[1]);
        $index2=$oligos_arr.ID.IndexOf($arr[0]+'_'+$arr[2]);

        if($index1 -ne -1 -and $index2 -ne -1){
                [int]$t1=$oligos_arr[$index1].begin - 1;
                [int]$t2=$oligos_arr[$index2].end - 1;
                sc ".\$_.txt" -Value (-join($_5gt3[$t1..$t2])) -Force -Verbose -NoNewline;
        }
}

[Console]::Write("全部完成!");[/code]同目录下放一个MyScript.bat:[code]@echo off
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dpn0.ps1'"
exit[/code]直接执行MyScript.bat即可实现自动提取数据,虽然不懂Powershell功能,但是感觉比批处理还是要功能更强大一些。


[img=353,128]https://s1.ax1x.com/2022/05/23/X91xv4.png[/img]

13545876873 发表于 2022-5-24 08:19

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=255965&ptid=62784]27#[/url] [i]xczxczxcz[/i] [/b]

大哥用你和 31楼大哥的方法,我在其他的文件夹里也试过了,运行没有问题:lol

      能不能在文件夹(2022)外面搞一个bat,这个bat可以把这个文件夹(2022)  里的所有子文件夹(5001,5002,5003,5004等等),
      按照文件夹里的ab1文件上的区间,把所有文件夹都生成相信的txt文档啊
[img]https://s1.ax1x.com/2022/05/24/XCpm1U.png[/img]

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.