交换文本文件中的字符

时间:2010-01-08 10:52:38

标签: windows command-line sed awk grep

我有一个200 Mb的文本文件,并且每行需要将第3和第4个字符与第6和第7个字符交换,以便

1234567890

会变成

1267534890

我正在使用安装了PowerShell的Windows XP。还安装了Cygwin和UnxUtils,因此可以访问cut,sed,awk,grep等版本。文件中没有分隔符,BTW。

任何建议都将不胜感激。

谢谢!

4 个答案:

答案 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 }'
相关问题