代码之家  ›  专栏  ›  技术社区  ›  Driver

替换大型日志文件中的字符

  •  3
  • Driver  · 技术社区  · 11 年前

    如何在Windows下更改非常大的日志文件:

       3334-444-(4)  anything   anything2
       4444-444-(4)  anything   anything2
       4744-454-(4)  anything   anything2
       48444 44-(4)  anything   anything2
       8444-444-(4)  anything   anything2
       4464-(444)-2  anything   anything2
    

    对此:

    33344444         anything   anything2
    44444444         anything   anything2
    47444544         anything   anything2
    48444444         anything   anything2
    84444444         anything   anything2
    44644442         anything   anything2
    

    删除每行中除数字以外的18位的所有内容,并保留第二列的位置?

    \\编辑: 问题是,从位置1到17也可能是数字之间的空格。这是我认为可行的逻辑:
    1.从位置1到17,将“(”,“)”,“-”替换为“”[空格]
    2.从位置1到17,将“”[空格]替换为“”[无],并计数变化
    3.从位置1到17,根据前一步的每次更改,在数字后添加空格

    6 回复  |  直到 11 年前
        1
  •  1
  •   Fredrik Pihl    11 年前

    好吧,如果你安装 cygwin ,您可以使用命令行工具的强大功能

    $ sed 's/[-)(]//g' input
    33344444  anything   anything2
    44444444  anything   anything2
    47444544  anything   anything2
    48444444  anything   anything2
    84444444  anything   anything2
    44644442  anything   anything2
    

    使现代化

    有时将一项复杂的任务分成更小的部分更容易。

    假设输入看起来像这样(添加标尺)

             1         2         3         4         5
    12345678901234567890123456789012345678901234567890
       3334-444-(4)  anything   anything2
       4444-444-(4)  anything   anything2
       4744-454-(4)  anything   anything2
       48444 44-(4)  anything   anything2
       8444-444-(4)  anything   anything2
       4464-(444)-2  anything   anything2
    

    步骤1 是要使用的 cut 好吧,剪切掉前17个字符,删除不需要的字符并存储在tmp文件中。

    步骤2 将字符18剪切到行尾并存储在tmp文件中。

    步骤3 将tmp文件合并为一个文件。

    类似这样的内容:

    $ cut -c1-17 input | sed 's/[-)( ]*//g' > c1
    
    $ cut -c18- input > c2
    
    $ paste c1 c2
    

    如果这不符合你的审美观,你可以一次性使用 awk 。将以下行放在一个名为“col.awk”的文件中,如果你喜欢,可以选择一个更好的名称:

    {
      x = substr($0, 0, 17)
      y = substr($0, 18, length($0))
      gsub(/[-)( ]*/, "", x)
    }
    { printf "%-18s%s\n", x, y }
    

    然后这样称呼它:

    $ awk -f col.awk input
    

    输出(再次使用标尺):

             1         2         3         4         5
    12345678901234567890123456789012345678901234567890
    33344444         anything   anything2
    44444444         anything   anything2
    47444544         anything   anything2
    48444444         anything   anything2
    84444444         anything   anything2
    44644442         anything   anything2
    

    请注意,cygwin喜欢所有东西都有unix风格的行尾,所以您可能需要将输入从windows风格转换为unix风格。一个可能对您有所帮助的工具是 dos2unix fromdos (谷歌是你的朋友)。

        2
  •  0
  •   Jeff B    11 年前

    您可以尝试Ultra Edit。这是一个编辑器,允许您在列模式下进行选择,这样您就可以选择前18个字符并以这种方式进行替换。

    唯一想到的另一件事是使用一个具有宏功能的编辑器来完成。

    或者写一个快速而肮脏的程序。

        3
  •  0
  •   SMS    11 年前

    使用以下正则表达式并替换为“”(空字符串)

    [-\(\)]
    

    希望能有所帮助。

        4
  •  0
  •   Uphill_ What '1    11 年前

    下载 notepad++ 。打开文档并按CTRL+h进行搜索和替换。

    在“查找内容”框中使用以下正则表达式:

    ^([0-9]+)\-?\(?([0-9]+)\)?\-?\(?([0-9]+)\)?
    

    在“替换为”框中:

    \1\2\3
    

    在搜索模式下选择“正则表达式”,然后全部替换。

        5
  •  0
  •   gaussblurinc    11 年前

    真的,不确定 Windows 可以简单地做到这一点。

    但是

    您可以安装 Perl -用于文本和字符串操作的良好语言。

    或者找linux机器。

    您可以在这里找到安装程序: Strawberry

    安装后,只需在控制台中运行即可( cmd.exe )

    perl-i.bak-ne的s/^\s//&&s/[-()]//g&&s/\s/\t/;打印;'输入文件

    这将保存您的备份文件( input.txt.bak )然后你就可以在 input.txt 文件

        6
  •  0
  •   Casimir et Hippolyte    7 年前

    使用sed:

    sed -E ':a;s/^([0-9]*)([( ]|-\(?|\)-?)([0-9]+)\)?/\1\3/;ta;s/[ \t]+/         /;' file