标题: [文本处理] 请教两个文本合拼 实现结果文本交替内容效果批处理 [打印本页]
作者: hqhlwz 时间: 2019-3-9 17:31 标题: 请教两个文本合拼 实现结果文本交替内容效果批处理
请教 文本A内容如图
文本B内容如图
请问如何利用批处理 实现 A与B文本合拼后 实现最终文本 奇数行是原A文本内容 偶数行原B文本内容呢
作者: Blitz 时间: 2019-3-9 17:56
- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (a.txt) do (
- set /p b=
- echo %%a
- echo !b!
- ))<b.txt>c.txt
复制代码
作者: ivor 时间: 2019-3-9 18:16
如果两个文件文本行数不相等,不会产生新的数据- @Powershell "& {[ScriptBlock]::Create("'#' + (gc '%~f0' -raw)").Invoke()}" & pause & goto :eof
- $file1 = ([System.IO.FileInfo]".\a.txt").OpenText()
- $file2 = ([System.IO.FileInfo]".\b.txt").OpenText()
- while(($file1.Peek() -ne -1) -or ($file2.Peek() -ne -1)){
- if($file1.Peek() -ne -1){Add-Content -Value $file1.ReadLine() -Path .\c.txt}
- if($file2.Peek() -ne -1){Add-Content -Value $file2.ReadLine() -Path .\c.txt }
- }
- $file1.Close();$file2.Close()
复制代码
作者: yhcfsr 时间: 2019-3-9 18:25
本帖最后由 yhcfsr 于 2019-3-9 18:30 编辑
楼上代码高大上,我来一个笨拙的- @Powershell "& {[ScriptBlock]::Create("'#' + (gc '%~f0' -raw)").Invoke()}" & pause & goto :eof
- $text_A = type a.txt -ReadCount 0;
- $text_B = type b.txt -ReadCount 0;
-
- $count_a, $count_b = $text_A.Count, $text_B.Count;
- $count = $count_a + $count_b;
-
- [System.Collections.ArrayList] $result = @();
-
- $counter_a, $counter_b = 0, 0;
- for($i=0;$i -lt $count;$i++)
- {
- #如果A文本读完,只处理B
- if($counter_a -eq $count_a) { [void] $result.Add($text_B[$counter_B++]); }
-
- #如果B文本读完,只处理A
- elseif($counter_b -eq $count_b) { [void] $result.Add($text_A[$counter_a++]); }
-
- #如果A,B都未完,下标为偶数时,加入A元素;下标为奇数时,加入B元素
- else {
- if($i%2 -eq 0) {[void] $result.Add($text_A[$counter_a++]); }
- else {[void] $result.Add($text_B[$counter_b++]); }
- }
- }
-
- #输出结果
- [io.file]::WriteAllLines('结果.txt',$result,[text.encoding]::Default);
复制代码
作者: hqhlwz 时间: 2019-3-19 16:48
多谢 各位大侠指教
作者: hqhlwz 时间: 2019-3-19 17:07
回复 3# ivor 好 请问运行提示无效数据 是什么原因呢
作者: hqhlwz 时间: 2019-3-21 15:32
回复 4# yhcfsr 请教 出错原因
作者: 523066680 时间: 2019-3-21 16:29
- use File::Slurp;
- use List::MoreUtils qw/pairwise/;
- my @a = grep { chomp } read_file("a.txt");
- my @b = grep { chomp } read_file("b.txt");
- my @c = pairwise { $a, $b } @a, @b;
- grep { printf "%2d %s\n", $_+1, $c[$_] } 0..$#c;
复制代码
B文本偶数行,含行号- 1 A
- 2 B
- 3 A1
- 4 B1
- 5 A2
- 6 B2
- 7
- 8 B3
- 9
- 10 B4
复制代码
作者: xczxczxcz 时间: 2019-3-21 17:07
这玩意有必要那么复杂吗? 简单就好。- $a = gc a.txt -Readcount 0; $b = gc b.txt -Readcount 0;
- $arr = @(); $count = $a.count;
- if ( $b.count -gt $a.count ) { $count = $b.count };
- for ( $i=0; $i -lt $count; $i++ ) { $arr += $a[$i]; $arr += $b[$i] };
- $arr>c.log;
复制代码
作者: xczxczxcz 时间: 2019-3-21 17:13
回复 7# hqhlwz
他们用的是对象的属性方法,要求两边的数据对齐才行。换成对象的方法(method)就可以了。
作者: tigerpower 时间: 2019-3-21 17:26
这个问题在此帖中讨论过
可以用busybox- busybox paste -d\n a.txt b.txt
复制代码
作者: 523066680 时间: 2019-3-21 17:57
本帖最后由 523066680 于 2019-3-21 18:27 编辑
回复 11# tigerpower
在 MSYS 2 和 BusyBox 分别试了一下,行为不一样
msys的 paste 会把B的内容固定在偶数行(会预留间隔空行),busybox 的 paste 将不会预留那些间隔。
作者: WHY 时间: 2019-3-21 19:23
- gawk "{if(FNR==NR)a[2*FNR-1]=$0;else a[2*FNR]=$0}END{for(i=1;i<=length(a);i++)print a[i]}" a.txt b.txt > c.txt
复制代码
- gawk "{a[FNR]=$0\"\n\"a[FNR]}END{for(i=1;i<=length(a);i++)printf a[i]}" b.txt a.txt
复制代码
作者: yhcfsr 时间: 2019-3-21 19:32
回复 7# hqhlwz
我测试没问题,把bat与a.txt,b.txt放一起测试.
如果你本身就是这样做才出的问题,那应该可能是系统版本原因,因为脚本第一句原因,需要powershell 5.0,也就是说需要WIN10系统
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |