Обмен символов в текстовом файле - PullRequest
0 голосов
/ 08 января 2010

У меня есть текстовый файл 200 Мб, и для каждой строки необходимо поменять местами 3-й и 4-й символы с 6-м и 7-м, чтобы

1234567890

станет

1267534890

Я использую Windows XP с установленным PowerShell. Также установлены Cygwin и UnxUtils, поэтому они имеют доступ к версиям cut, sed, awk, grep и т. Д. В файле нет разделителя, BTW.

Любые предложения будут оценены.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 08 января 2010

Для каждой строки используйте sed для поиска / замены:


    sed -e 's/^\(..\)\(..\)\(.\)\(..\)\(.*\)$/\1\4\3\2\5/g'
1 голос
/ 08 января 2010

, так как у вас есть 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
0 голосов
/ 08 января 2010

Для очень длинных входных файлов я бы предпочел это, потому что нет соответствия регулярному выражению и будет намного быстрее

awk -F '' '{ print $1 $2 $6 $7 $5 $3 $4 $8 $9 $10 }'
0 голосов
/ 08 января 2010

Наивный путь:

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 МиБ.

Поскольку вы никогда не изменяете никакие длины и только смещаете байты вокруг, вы, скорее всего, можете сделать это и на месте. Я посмотрю, хорошо ли это работает.

...