标题: [文本处理] 【已解决】求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在命令行窗口下的实现方法如下- 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
2楼说的非常清楚,需要在命令行窗口执行。
如果你想在bat脚本里面执行,需要把1个百分号替换为2个百分号,例如:- 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
查看版本的方法:
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编码- @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
复制代码
作者: 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试试:- @echo off
- chcp 65001 >nul
- set /p x=Please enter the specified line number:
- set /a m=x-1
- (for /f "delims=" %%i in (1.txt) do (
- if defined Line4 echo,!Line4!
- for /l %%j in (%m%,-1,1) do (
- set /a n=%%j+1
- set Line!n!=!Line%%j!
- )
- set line1=%%i
- )
- if defined Line4 (
- type 2.txt
- for /l %%i in (%x%,-1,1) do echo,!Line%%i!
- ))>3.txt
- 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默认继承源文件编码。- @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
复制代码
二。纯P的另一套思路。第3行获取1.txt总行数,第4行切出1.txt前段,第5行切出1.txt后段,第6行拼接各段合成结果。- @echo off &setlocal enabledelayedexpansion
- chcp 65001>nul
- set "n=1" & for /f %%n in ('find /v /c "" ^<1.txt') do set/a "m=%%n-4"
- (for /f "delims=" %%s in (1.txt) do if !n! leq !m! (set/a "n+=1" & echo,%%s))>1.1
- more +!m! 1.txt>1.2
- copy /y 1.1+2.txt+1.2 1.new.txt>nul
- 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文件没有空行结尾所致。
代码加一句即可。- @echo off
- for /f %%n in ('sed -n "$=" 1.txt') do set/a "n=%%n-4"
- 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最后有一行空行- 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 最后无空行- 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行(不是倒数)插入...- (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方案适于大量复杂的作业调度,用于本例显得沉重了,不如以下代码简明利索...仅供参考。- @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)>1.new.txt
复制代码
作者: yyz219 时间: 2024-1-28 12:13
很好的代码
作者: qixiaobin0715 时间: 2024-1-29 10:15
本帖最后由 qixiaobin0715 于 2024-1-29 10:17 编辑
这样可以不必理会2.txt末尾是否存在空行:- @echo off
- chcp 65001>nul
- set x=4
- set /a m=x-1
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (1.txt) do (
- if defined Line4 echo,!Line4!
- for /l %%j in (%m%,-1,1) do (
- set /a n=%%j+1
- set Line!n!=!Line%%j!
- )
- set line1=%%i
- )
- if defined Line4 (
- for /f "delims=" %%i in (2.txt) do echo,%%i
- for /l %%i in (%x%,-1,1) do echo,!Line%%i!
- ))>3.txt
- pause
复制代码
作者: yyz219 时间: 2024-1-29 10:23
回复 31# qixiaobin0715
乐于助人
作者: buyiyang 时间: 2024-1-29 12:58
sed实现在1.txt倒数第四行前插入2.txt,无论2.txt末尾是否存在空行。- sed -n -e ":a;$r 2.txt" -e "$q;N;5,${P;D};ba" 1.txt|sed "${/^$/!s/$/\n/}">1_new.txt
- sed ":a;$q;N;5,$D;ba" 1.txt>>1_new.txt
复制代码
作者: WHY 时间: 2024-1-29 15:19
本帖最后由 WHY 于 2024-1-30 17:56 编辑
- @echo off
- chcp 65001 > nul
- for /f "delims=" %%i in (1.txt) do set /a n+=1
- (for /f "delims=" %%i in (1.txt) do (
- set /a n-=1
- echo;%%i
- setlocal enabledelayedexpansion
- if !n!==4 (
- endlocal
- for /f "delims=" %%j in (2.txt) do echo;%%j
- ) else endlocal
- )) > 3.txt
- pause
复制代码
作者: WHY 时间: 2024-1-29 15:22
- 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运行- @echo off
- set n=4
- 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"
- pause
复制代码
作者: yyz219 时间: 2024-1-30 18:54
回复 37# WHY
乐于助人
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |