Board logo

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

作者: yyz219    时间: 2024-1-21 08:41     标题: 【已解决】求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里面的内容————有:<   \   />   "" 也有中文 等)【第三方也行】
============================================================
作者: hfxiang    时间: 2024-1-21 09:22

回复 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
复制代码

作者: yyz219    时间: 2024-1-21 09:39

回复 2# hfxiang


    我试一试先 谢谢
作者: yyz219    时间: 2024-1-21 09:56

回复 2# hfxiang


    没有成功

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

看看哪里有问题?谢谢
作者: ShowCode    时间: 2024-1-21 10:01

回复 4# yyz219


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

1、你用的gawk版本是?
2、你是在CMD窗口执行的2楼命令?还是把它放在bat脚本里面执行的?
3、请把你的1.txt和2.txt打包上传我试试。
作者: yyz219    时间: 2024-1-21 10:05

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
作者: ShowCode    时间: 2024-1-21 10:19

回复 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
复制代码

作者: ShowCode    时间: 2024-1-21 10:21

本帖最后由 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.

作者: yyz219    时间: 2024-1-21 10:32

回复 7# ShowCode


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


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

谢谢
作者: ShowCode    时间: 2024-1-21 10:35

回复 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
复制代码

作者: yyz219    时间: 2024-1-21 10:41

回复 10# ShowCode


    完美解决了,再次感谢
作者: yyz219    时间: 2024-1-23 08:29

回复 7# ShowCode


    是我大意,没有看清楚  非常感谢
作者: qixiaobin0715    时间: 2024-1-26 10:32

本帖最后由 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
复制代码

作者: yyz219    时间: 2024-1-26 11:15

回复 13# qixiaobin0715


    我试一试 谢谢
作者: aloha20200628    时间: 2024-1-26 12:39

本帖最后由 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
复制代码

作者: yyz219    时间: 2024-1-26 12:46

回复 15# aloha20200628


    谢谢
作者: yyz219    时间: 2024-1-26 17:55

回复 15# aloha20200628

1.txt:
1111111111111111111
1111111111111111111
1111111111111111111
1111111111111111111
1111111111111111111
1111111111111111111
1111111111111111111

2.txt:
22222222222
22222222222
用sed.exe以后,得到的1.new.txt:
1111111111111111111
1111111111111111111
1111111111111111111
22222222222
222222222221111111111111111111
1111111111111111111
1111111111111111111
1111111111111111111
=============================
但是希望得到的是:
1111111111111111111
1111111111111111111
1111111111111111111
22222222222
22222222222
1111111111111111111
1111111111111111111
1111111111111111111
1111111111111111111


能不能修改一下?谢谢
作者: aloha20200628    时间: 2024-1-26 18:34

回复 17# yyz219

2.txt文件没有空行结尾所致。
代码加一句即可。
  1. @echo off
  2. for /f %%n in ('sed -n "$=" 1.txt') do set/a "n=%%n-4"
  3. echo,>>2.txt & sed "%n% r 2.txt" 1.txt>1.new.txt
复制代码

作者: yyz219    时间: 2024-1-26 18:37

回复 18# aloha20200628


    谢谢  问题解决了  再次感谢
作者: yyz219    时间: 2024-1-26 22:19

回复 15# aloha20200628


    如果要在第4行(不是倒数)插入,又应该怎么样?谢谢
作者: hfxiang    时间: 2024-1-27 11:50

回复 20# yyz219

如果文件2.txt最后有一行空行
  1. sed "4r2.txt" 1.txt>3.txt
复制代码

作者: yyz219    时间: 2024-1-27 11:51

回复 21# hfxiang


    我试一试先 谢谢
作者: yyz219    时间: 2024-1-27 11:52

成功了 再次感谢
作者: hfxiang    时间: 2024-1-27 13:01

回复 23# yyz219

如果文件 2.txt 最后无空行
  1. sed -e "4r2.txt" -e "5s/^/\n/" 1.txt>3.txt
复制代码

作者: yyz219    时间: 2024-1-27 13:20

回复 24# hfxiang


    谢谢
作者: aloha20200628    时间: 2024-1-27 15:53


可请 findstr 露一手,先检测 2.txt 是否存在末尾空行,再选择sed方案而行。
假设要在第4行(不是倒数)插入...
  1. (findstr /v $ 2.txt>nul && (sed -e "5 s/^/\n/" -e "4 r 2.txt" 1.txt)||sed "4 r 2.txt" 1.txt)>1.new.txt
复制代码

作者: yyz219    时间: 2024-1-28 07:43

回复 26# aloha20200628


    这个方便
作者: yyz219    时间: 2024-1-28 07:46

本帖最后由 yyz219 于 2024-1-28 09:08 编辑

回复 26# aloha20200628


    再弄一个:倒数)插入的

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

:you
for /f %%n in ('sed.exe -n "$=" 1.txt') do set/a "n=%%n-4"
sed.exe "%n% r 2.txt" 1.txt>3.txt
exit
作者: aloha20200628    时间: 2024-1-28 11:14

本帖最后由 aloha20200628 于 2024-1-28 11:27 编辑

回复 28# yyz219

goto方案适于大量复杂的作业调度,用于本例显得沉重了,不如以下代码简明利索...仅供参考。
  1. @echo off
  2. for /f %%n in ('sed -n "$=" 1.txt') do (set/a "n=%%n-4, m=n+1")
  3. (findstr /v $ 2.txt>nul && (sed -e "%m% s/^/\n/" -e "%n% r 2.txt" 1.txt)||sed "%n% r 2.txt" 1.txt)>1.new.txt
复制代码

作者: yyz219    时间: 2024-1-28 12:13

很好的代码
作者: qixiaobin0715    时间: 2024-1-29 10:15

本帖最后由 qixiaobin0715 于 2024-1-29 10:17 编辑

这样可以不必理会2.txt末尾是否存在空行:
  1. @echo off
  2. chcp 65001>nul
  3. set x=4
  4. set /a m=x-1
  5. setlocal enabledelayedexpansion
  6. (for /f "delims=" %%i in (1.txt) do (
  7.     if defined Line4 echo,!Line4!
  8.     for /l %%j in (%m%,-1,1) do (
  9.         set /a n=%%j+1
  10.         set Line!n!=!Line%%j!
  11.     )
  12.     set line1=%%i
  13. )
  14. if defined Line4 (
  15.     for /f "delims=" %%i in (2.txt) do echo,%%i
  16.     for /l %%i in (%x%,-1,1) do echo,!Line%%i!
  17. ))>3.txt
  18. pause
复制代码

作者: yyz219    时间: 2024-1-29 10:23

回复 31# qixiaobin0715


     乐于助人
作者: buyiyang    时间: 2024-1-29 12:58

sed实现在1.txt倒数第四行前插入2.txt,无论2.txt末尾是否存在空行。
  1. sed -n -e ":a;$r 2.txt" -e "$q;N;5,${P;D};ba" 1.txt|sed "${/^$/!s/$/\n/}">1_new.txt
  2. sed ":a;$q;N;5,$D;ba" 1.txt>>1_new.txt
复制代码

作者: WHY    时间: 2024-1-29 15:19

本帖最后由 WHY 于 2024-1-30 17:56 编辑
  1. @echo off
  2. chcp 65001 > nul
  3. for /f "delims=" %%i in (1.txt) do set /a n+=1
  4. (for /f "delims=" %%i in (1.txt) do (
  5.     set /a n-=1
  6.     echo;%%i
  7.     setlocal enabledelayedexpansion
  8.     if !n!==4 (
  9.         endlocal
  10.         for /f "delims=" %%j in (2.txt) do echo;%%j
  11.     ) else endlocal
  12. )) > 3.txt
  13. pause
复制代码

作者: WHY    时间: 2024-1-29 15:22

  1. gawk "NR==FNR{a[NR]=$0}NR>FNR{b[FNR]=$0}END{n=length(a)-4;for(i in a){print a[i];if(i==n)for(j in b)print b[j]}}" 1.txt 2.txt>3.txt
复制代码

作者: yyz219    时间: 2024-1-29 19:34

回复 35# WHY


    乐于助人
作者: WHY    时间: 2024-1-30 18:00

其实用 PowerShell 也还不错,没那么多弯弯绕。保存为 Test.bat运行
  1. @echo off
  2. set n=4
  3. PowerShell "[Collections.ArrayList]$a=gc 1.txt -enc UTF8; $b=gc 2.txt -enc UTF8; $a.Insert($a.Count-%n%, $b); sc 3.txt $a -enc UTF8"
  4. pause
复制代码

作者: yyz219    时间: 2024-1-30 18:54

回复 37# WHY


    乐于助人




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2