【问题标题】:Swapping characters within a text file在文本文件中交换字符
【发布时间】:2011-01-02 21:03:45
【问题描述】:

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

1234567890

会变成

1267534890

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

任何建议将不胜感激。

谢谢!

【问题讨论】:

    标签: windows command-line sed awk grep


    【解决方案1】:

    对于每一行,使用 sed 进行查找/替换:

    
        sed -e 's/^\(..\)\(..\)\(.\)\(..\)\(.*\)$/\1\4\3\2\5/g'
    

    【讨论】:

    • 太棒了...工作得很好...谢谢!我喜欢像这样使用 sed 的简单单行代码,但对反向引用了解不够,无法像这样尝试它。对于其他 Windows 用户,将撇号替换为引号,并在末尾添加“输入文件”>“输出文件”行。否则,按原样工作。干杯!
    • 不错。为了进一步简化,您不需要 \(.*\)$\5 部分。
    • 如果您自己没有找到它,请查看 grepWin,它是在 Windows 系统上进行 grep 的一个很好的实用程序。当然,您可以在 Cygwin 中使用 sed 和 awk,我已经这样做了很多年,但是自从偶然发现 grepWin 以来,我越来越多地使用它。不,我不是作者,也不是作者的合作伙伴,只是我认为它是一个很棒的实用程序。
    【解决方案2】:

    因为你有 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
    

    【讨论】:

    • 没有尝试过 VBScript,但是 awk 脚本很有效 -- 谢谢 :)
    【解决方案3】:

    天真的方式:

    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 来说可能相当慢。

    由于您从不更改任何长度并且只在您周围移动字节,因此很可能也可以就地执行此操作。我看看效果好不好。

    【讨论】:

      【解决方案4】:

      对于很长的输入文件,我更喜欢这个,因为没有正则表达式匹配并且会更快

      awk -F '' '{ print $1 $2 $6 $7 $5 $3 $4 $8 $9 $10 }'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-06
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        相关资源
        最近更新 更多