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

[文本处理] 【已解决】求bat脚本在1.txt的倒数第4行前面插入2.txt里面的内容。谢谢

本帖最后由 yyz219 于 2024-1-28 12:43 编辑

完美解决了:

方法一(倒数插入)
@echo off
for /f %%n in ('sed -n "$=" 1.txt') do set/a "n=%%n-4"
sed "%n% r 2.txt" 1.txt>1.new.txt
【注意:2.txt————最后要有一行空行】

自动判断有没有空行:

::【在 “1.txt” 的倒数第4行 插入 “2.txt” 里面的内容】【自动判断2.txt 是否存在末尾空行】
@echo off
for /f %%n in ('sed -n "$=" 1.txt') do (set/a "n=%%n-4, m=n+1")
(findstr /v $ 2.txt>nul && (sed -e "%m% s/^/\n/" -e "%n% r 2.txt" 1.txt)||sed "%n% r 2.txt" 1.txt)>3.txt
exit

方法二(倒数插入)
1.bat
1.txt
2.txt
全部保存为UTF-8编码
@echo off
chcp 65001 >nul
gawk -vN=4 "NR>FNR;NR==FNR{if(NR>N){print a[NR%%N]}{a[NR%%N]=$0;NN=NR}}END{for(i=NN-N;++i<=NN;)if(i%%N in a)print a[i%%N]}" 1.txt 2.txt>3.txt


=======================================
三、第4行(不是倒数)插入:
sed "4r2.txt" 1.txt>3.txt

【注意:2.txt————最后要有一行空行】

自动判断有没有空行
::【在 “1.txt” 的第4行 插入 “2.txt” 里面的内容】【自动判断2.txt 是否存在末尾空行】
@echo off
(findstr /v $ 2.txt>nul && (sed -e "5 s/^/\n/" -e "4 r 2.txt" 1.txt)||sed "4 r 2.txt" 1.txt)>4.txt
exit

===========================================
原来的问题:
求bat:在1.txt的倒数第4行前面插入2.txt里面的内容。谢谢
(2.txt里面的内容————有:<   \   />   "" 也有中文 等)【第三方也行】
============================================================
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
我是小白,希望老师多多帮助

回复 1# yyz219
gawk在命令行窗口下的实现方法如下
  1. gawk -vN=4 "NR>FNR;NR==FNR{if(NR>N){print a[NR%N]}{a[NR%N]=$0;NN=NR}}END{for(i=NN-N;++i<=NN;)if(i%N in a)print a[i%N]}" 1.txt 2.txt>3.txt
复制代码
1

评分人数

TOP

回复 2# hfxiang


    我试一试先 谢谢
我是小白,希望老师多多帮助

TOP

回复 2# hfxiang


    没有成功

得到的3.txt————里面没有内容

看看哪里有问题?谢谢
我是小白,希望老师多多帮助

TOP

回复 4# yyz219


在我的电脑上测试2楼代码是成功的。

1、你用的gawk版本是?
2、你是在CMD窗口执行的2楼命令?还是把它放在bat脚本里面执行的?
3、请把你的1.txt和2.txt打包上传我试试。
1

评分人数

    • yyz219: 在6楼,辛苦了技术 + 1
测试代码之前请做好备份

TOP

1.txt:
<?xml version="1.0" encoding="UTF-8"?>
<root version="4" type="3" timestamp="1705724211">
        <apps>
                <item path="CryptSvc" hash="5D00BBEB147E0C838A622FC42C543B2913D57EACA4E69D9A37ED61E98C819347" timestamp="1446189930" is_undeletable="true"/>
                <item path="Dhcp" hash="5D00BBEB147E0C838A622FC42C543B2913D57EACA4E69D9A37ED61E98C819347" timestamp="1446189930" is_undeletable="true"/>
                <item path="Dnscache" hash="5D00BBEB147E0C838A622FC42C543B2913D57EACA4E69D9A37ED61E98C819347" timestamp="1446189930" is_undeletable="true"/>
                <item path="NlaSvc" hash="5D00BBEB147E0C838A622FC42C543B2913D57EACA4E69D9A37ED61E98C819347" timestamp="1446189930" is_undeletable="true"/>
                <item path="X:\Windows\system32\SppExtComObj.exe" hash="" timestamp="1705666849" is_undeletable="true"/>
                <item path="wlidsvc" hash="" timestamp="1705666849" is_undeletable="true"/>
                <item path="Spooler" hash="" timestamp="1705666849" is_undeletable="true"/>
                <item path="X:\Windows\system32\lsass.exe" hash="8ACC32C88D81943A8A90FDAF4772C3EDE06CAB5F489F59525BEA7AAB99DAAE73" timestamp="1705666849" is_undeletable="true"/>
                <item path="wuauserv" hash="" timestamp="1705666849" is_undeletable="true"/>
                <item path="DoSvc" hash="" timestamp="1705666849" is_undeletable="true"/>
                <item path="UsoSvc" hash="" timestamp="1705666849" is_undeletable="true"/>
                <item path="D:\PE整理碎片(很好)\修改PE\到网络桌面\防火墙\64\simplewall.exe" hash="6F22801BF917D8F74EE3921F9B45415ADCCB08F9A85CC510FB5CC4096EA5760D" timestamp="1705666849" is_undeletable="true"/>
                <item path="System" hash="BBBB647AD2F73CB0E968597E527E6334A8EE4C53E9845CA941BBBCCC7D113699" timestamp="1705666849" is_undeletable="true"/>
                <item path="X:\Windows\system32\svchost.exe" hash="5D00BBEB147E0C838A622FC42C543B2913D57EACA4E69D9A37ED61E98C819347" timestamp="1705666849" is_undeletable="true"/>
                <item path="D:\PE整理碎片(很好)\修改PE\程序\龙卷风收音\龙卷风收音.exe" hash="65D3B707B3A177B89A5192ABFC2302D493C6B8B534786D02F833B9C9697FD04C" timestamp="1705708280" is_enabled="true"/>
                <item path="D:\PE整理碎片(很好)\修改PE\程序\没用到——程序目录的\防火墙\64\simplewall.exe" hash="6F22801BF917D8F74EE3921F9B45415ADCCB08F9A85CC510FB5CC4096EA5760D" timestamp="1705668371" is_undeletable="true"/>
                <item path="D:\1绿色软件\网络\百度云管家\百度云 7.26\BaiduNetdisk.exe" hash="6FAC8B20F210BF735E759390ECF823D9467CF3F31BE6C9902607A497E2F9247A" timestamp="1705706959" is_enabled="true"/>
                <item path="D:\1绿色软件\网络\浏览器\便携版百分3.2.4.23\chrome.exe" hash="EF1FD90CF833B99CE7ED683B61EE9382E6C94D895220835DCFB1F33F700238C1" timestamp="1705708070" is_enabled="true"/>
                <item path="D:\1绿色软件\多媒体\抓图抓滚动\搜狗拼音截图\SGSmartAssistant.exe" hash="3A7867D13217E5F84D4FBB45849C7B4D9E9AF9193FEEEFC0BD6DB60B4B5AD927" timestamp="1705709159" is_enabled="true"/>
                <item path="D:\1绿色软件\多媒体\抓图抓滚动\PE-OCR(F4)\SGSmartAssistant.exe" hash="ADE6B49801EB6D3D6C63FF994B711D770717E8692BB45A0270BD8D21374A740B" timestamp="1705710661" is_enabled="true"/>
        </apps>
        <rules_custom>
                <item name="BaiduNetdisk.exe" rule="124.237.208.36:80" rule_local="192.168.31.121:49767" dir="2" protocol="6" apps="D:\1绿色软件\网络\百度云管家\百度云 7.26\BaiduNetdisk.exe" is_enabled="true"/>
                <item name="chrome.exe" rule="222.217.94.111:443" rule_local="192.168.31.121:50052" dir="2" protocol="6" apps="D:\1绿色软件\网络\浏览器\便携版百分3.2.4.23\chrome.exe" is_enabled="true"/>
                <item name="龙卷风收音.exe" rule="140.143.180.217:80" rule_local="192.168.31.121:50109" dir="2" protocol="6" apps="D:\PE整理碎片(很好)\修改PE\程序\龙卷风收音\龙卷风收音.exe" is_enabled="true"/>
                <item name="搜狗OCR" rule="14.22.33.57:80" rule_local="192.168.31.121:50190" dir="2" protocol="6" apps="D:\1绿色软件\多媒体\抓图抓滚动\搜狗拼音截图\SGSmartAssistant.exe" is_enabled="true"/>
                <item name="SGSmartAssistant.exe" rule="14.22.33.57:80" rule_local="192.168.31.121:50310" dir="2" protocol="6" apps="D:\1绿色软件\多媒体\抓图抓滚动\PE-OCR(F4)\SGSmartAssistant.exe" is_enabled="true"/>
        </rules_custom>
        <rules_config>
        </rules_config>
</root>
2.txt:
<item name="红叶自动校时.exe" rule="" rule_local="" dir="2" protocol="6" apps="D:\1绿色软件\时间_日历\红叶自动校时\红叶自动校时.exe" is_enabled="true"/>
============================================
gawk版本————我不知道
是运行bat
我是小白,希望老师多多帮助

TOP

回复 6# yyz219


是运行bat

2楼说的非常清楚,需要在命令行窗口执行。

如果你想在bat脚本里面执行,需要把1个百分号替换为2个百分号,例如:
  1. gawk -vN=4 "NR>FNR;NR==FNR{if(NR>N){print a[NR%%N]}{a[NR%%N]=$0;NN=NR}}END{for(i=NN-N;++i<=NN;)if(i%%N in a)print a[i%%N]}" 1.txt 2.txt>3.txt
复制代码
1

评分人数

测试代码之前请做好备份

TOP

本帖最后由 ShowCode 于 2024-1-21 10:23 编辑

回复 6# yyz219


gawk版本————我不知道


查看版本的方法:

C:\Test> gawk --version
GNU Awk 5.1.0, API: 3.0
Copyright (C) 1989, 1991-2020 Free Software Foundation.
测试代码之前请做好备份

TOP

回复 7# ShowCode


    成功了,非常感谢
=======================
现在还有一个小问题:
1.txt——是:UTF-8  的
插人以后,原来在1.txt 的中文——乱码(不影响使用)


不知道这个问题能够解决吗(3.txt必须是:UTF-8,否则不能够使用)?

谢谢
我是小白,希望老师多多帮助

TOP

回复 9# yyz219


1.bat
1.txt
2.txt
全部保存为UTF-8编码
  1. @echo off
  2. chcp 65001 >nul
  3. gawk -vN=4 "NR>FNR;NR==FNR{if(NR>N){print a[NR%%N]}{a[NR%%N]=$0;NN=NR}}END{for(i=NN-N;++i<=NN;)if(i%%N in a)print a[i%%N]}" 1.txt 2.txt>3.txt
复制代码
1

评分人数

    • yyz219: 完美解决了,再次感谢技术 + 1
测试代码之前请做好备份

TOP

回复 10# ShowCode


    完美解决了,再次感谢
我是小白,希望老师多多帮助

TOP

回复 7# ShowCode


    是我大意,没有看清楚  非常感谢
我是小白,希望老师多多帮助

TOP

本帖最后由 qixiaobin0715 于 2024-1-26 10:34 编辑

回复 1# yyz219
纯P试试:
  1. @echo off
  2. chcp 65001 >nul
  3. set /p x=Please enter the specified line number:
  4. set /a m=x-1
  5. (for /f "delims=" %%i in (1.txt) do (
  6.     if defined Line4 echo,!Line4!
  7.     for /l %%j in (%m%,-1,1) do (
  8.         set /a n=%%j+1
  9.         set Line!n!=!Line%%j!
  10.     )
  11.     set line1=%%i
  12. )
  13. if defined Line4 (
  14.     type 2.txt
  15.     for /l %%i in (%x%,-1,1) do echo,!Line%%i!
  16. ))>3.txt
  17. pause
复制代码
1

评分人数

TOP

回复 13# qixiaobin0715


    我试一试 谢谢
我是小白,希望老师多多帮助

TOP

本帖最后由 aloha20200628 于 2024-1-26 12:52 编辑


给两个版本参考,用楼主提供的样本文件测试均予通过。
一。用sed.exe(从本站第三方工具可自由下载),简明利索,且不必过问文件编码问题,也许sed.exe默认继承源文件编码。
  1. @echo off
  2. for /f %%n in ('sed -n "$=" 1.txt') do set/a "n=%%n-4"
  3. sed "%n% r 2.txt" 1.txt>1.new.txt
复制代码
二。纯P的另一套思路。第3行获取1.txt总行数,第4行切出1.txt前段,第5行切出1.txt后段,第6行拼接各段合成结果。
  1. @echo off &setlocal enabledelayedexpansion
  2. chcp 65001>nul
  3. set "n=1" & for /f %%n in ('find /v /c "" ^<1.txt') do set/a "m=%%n-4"
  4. (for /f "delims=" %%s in (1.txt) do if !n! leq !m! (set/a "n+=1" & echo,%%s))>1.1
  5. more +!m! 1.txt>1.2
  6. copy /y 1.1+2.txt+1.2 1.new.txt>nul
  7. del /q 1.1 1.2 & chcp 936>nul & endlocal&exit/b
复制代码
1

评分人数

TOP

返回列表