我对脚本编写还很陌生,并且已经在Internet上进行了搜索,但是似乎找不到针对我要实现的目标的特定解决方案,所以我希望有人可以帮忙一下。
我有一个.txt文件,其中包含各种数据行,这些数据行是根据特定的列号(基本上是一个数据表)从文本开始组织的。请参见下面的示例,其中显示了每一列的起始位置:
| | |
|1214000 |1234567890 |ISRBWPX0001000001
| | |
|MD-3300 |+12345678912 |MDABWPX0001000001
| | |
| | |
| | |
Col:620 Col:632 Col:672
Please click here for screenshot if above example makes no sense
我希望脚本在第620列中找到所有包含“ MD-”的行并将其删除,因此仅保留数字。因此,我在PowerShell中运行了Replace命令,该命令确实删除了所有包含“ MD-”的行,但是它使其余的列未对齐;
使用的PowerShell命令:
(Get-Content "test.txt") |
Foreach-Object {$_.replace("MD-", "")} |
Set-Content "testedited.txt"
以上命令的输出:
| | |
|1214000 |1234567890 |ISRBWPX0001000001
| | |
|3300 |+12345678912 |MDABWPX0001000001
| | |
| | |
| | |
Col:620 Col:632 Col:672
Click here for screenshot if above example makes no sense
如您所见,'+ 12345678912'不再与632列对齐,并且'MDABWPX0001000001'不再与672列对齐。
是否有一种方法可以执行上述命令而不影响其他列?我读到某个地方哈希表可以做到这一点,但是我并不完全理解该方法。
所需的输出:
| | |
|1214000 |1234567890 |ISRBWPX0001000001
| | |
|3300 |+12345678912 |MDABWPX0001000001
| | |
| | |
| | |
Col:620 Col:632 Col:672
Please click here to see screenshot of desired output
我愿意使用任何脚本语言/方法来执行此任务,因此任何建议将不胜感激。
非常感谢您。
答案 0 :(得分:1)
使用-replace正则表达式很容易做到这一点。我从第11列开始使用“ MD”进行了测试。将其更改为620,或任何需要的值。
(Get-Content "test.txt") |
ForEach-Object { $_ -replace '^(.{11})MD\-([^ ]*|)(.*)$', '$1$2 $3' } |
Set-Content "testedited.txt"
这是测试数据和样品运行。
PS C:\src\t\repmd> Get-Content .\test.txt
0123456789|asdf |asdfdsaf
0123456789|MD-333 |asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqw |asdfdsaf
PS C:\src\t\repmd> .\repmd.ps1
PS C:\src\t\repmd> Get-Content .\testedited.txt
0123456789|asdf |asdfdsaf
0123456789|333 |asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqw |asdfdsaf
正则表达式像这样分解。
^ beginning of string
(.{11}) capture 1 - eleven (11) characters
MD\- literal 'MD-' (the '-' character needs to be escaped with \
([^ ]*|) capture 2 - all non-space characters until a VERTICAL LINE
(.*) capture 3 - all remaining characters
$ end of string
'$1$2 $3'
生成捕获的字符串。 $ 3之前的三(3)个空格用'MD-'代替三(3)个字符。
答案 1 :(得分:1)
$_ -replace '(?<=.{620})MD-([0-9]+)',('$1'+' '*3)
答案 2 :(得分:0)
@echo off
setlocal EnableDelayedExpansion
rem Change next line by 620 and 12
set /A "pos=11, wide=8"
set /A "posP3=pos+3, rest=wide-3, posPwide=pos+wide"
(for /F "delims=" %%a in (Input.txt) do (
set "line=%%a"
if "!line:~%pos%,3!" equ "MD-" (
set "line=!line:~0,%pos%!!line:~%posP3%,%rest%! !line:~%posPwide%!"
)
echo !line!
)) > Output.txt
Input.txt :
0123456789|asdf |asdfdsaf
0123456789|MD-333 |asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqw |asdfdsaf
Output.txt :
0123456789|asdf |asdfdsaf
0123456789|333 |asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw |asdfdsaf
0123456789|cwqw |asdfdsaf