我有一个200 Mb的文本文件,并且每行需要将第3和第4个字符与第6和第7个字符交换,以便
1234567890
会变成
1267534890
我正在使用安装了PowerShell的Windows XP。还安装了Cygwin和UnxUtils,因此可以访问cut,sed,awk,grep等版本。文件中没有分隔符,BTW。
任何建议都将不胜感激。
谢谢!
答案 0 :(得分:3)
对于每一行使用sed进行查找/替换:
sed -e 's/^\(..\)\(..\)\(.\)\(..\)\(.*\)$/\1\4\3\2\5/g'
答案 1 :(得分:1)
因为你有cygwin和awk
{
tf = substr($0,3,2)
ss = substr($0,6,2)
print substr($0,1,2) ss substr($0,5,1) tf substr($0,8)
}
将上面的内容保存为myscript.awk和Windows命令行
c:\test> awk -f myscript.awk file
如果您喜欢使用Windows工具,可以使用vbscript作为替代
Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
Set objFile =objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfLine
strLine = objFile.ReadLine
tf = Mid(strLine,3,2)
ss = Mid(strLine,6,2)
WScript.Echo Mid(strLine,1,2) & ss & Mid(strLine,5,1) & tf & Mid(strLine,8)
Loop
将上面的内容保存为myscript.vbs并保存在命令行中
c:\test> cscript //nologo myscript.vbs file
答案 2 :(得分:0)
天真的方式:
Get-Content .\test.txt |
ForEach-Object { [string]::Concat(
$_.Substring(0,2),
$_.Substring(5,2),
$_.Substring(4,1),
$_.Substring(2,2),
$_.Substring(7)) } |
Out-File new.txt
虽然不是很好,但对于200 MiB可能相当慢。
由于你永远不会改变任何长度,只转换字节,你也很可能就地这样做。我会看看它是否运作良好。
答案 3 :(得分:0)
对于很长的输入文件,我更喜欢这个,因为没有正则表达式匹配并且会更快
awk -F '' '{ print $1 $2 $6 $7 $5 $3 $4 $8 $9 $10 }'