【问题标题】:removing space between numbers from a text file从文本文件中删除数字之间的空格
【发布时间】:2013-08-29 10:48:25
【问题描述】:

我有一个包含以下数据的文本文件。我想修改第二列如下。第二列中的第一行应从 36 65 fb 5f 1a c1 更改为 0x3665fb5f1ac1 如何使用 sed 或 awk 执行此操作或任何其他简单的方法(可能是vim。)

我希望第一行看起来像

0x5212cb03ca115ac0      0x3665fb5f1ac1

0x5212cb03ca115ac0      36 65 fb 5f 1a c1
0x5212cb03ca115cc0      36 65 fb 5f 1a c7
0x5212cb03ca115ea0      36 65 fb 5f 1a cd
0x5212cb03ca1160c0      36 65 fb 5f 1a d3
0x5212cb03ca1162a0      36 65 fb 5f 1a d9
0x5212cb03ca1164c0      36 65 fb 5f 1a de
0x5212cb03ca1166a0      36 65 fb 5f 1a e4
0x5212cb03ca1168a0      36 65 fb 5f 1a ea
0x5212cb03ca116aa0      36 65 fb 5f 1a f0
0x5212cb03ca116ca0      36 65 fb 5f 1a f6
0x5212cb03ca116ea0      36 65 fb 5f 1a fc
0x5212cb03ca1170a0      36 65 fb 5f 1b 02
0x5212cb03ca117280      36 65 fb 5f 1b 08
0x5212cb03ca117480      36 65 fb 5f 1b 0e
0x5212cb03ca117680      36 65 fb 5f 1b 14

【问题讨论】:

    标签: vim sed awk


    【解决方案1】:

    如果是一次性的(在平均工作日中会发生十几次),我喜欢使用 Vim 的块可视模式,通常与 qq...q 结合使用来录制快速宏。

    这里,假设起点是文件的开头 (gg):

    更新这是使用评论中建议的优化的演示:

    1。插入0x wCvGI0xEsc

    2。删除空格 fSpaceCvGx@ 987654330@;.;.;.

    任务完成!

    如果您没有设置nostartofline,您可以将G 替换为1000j 或类似名称(在这种情况下我更喜欢^VGw)。

    1. wf空格
      定位第二列空格
    2. ^v10000j
      在可视模式下突出显示该列(如果您设置了nostartofline,请使用G 而不是1000j
    3. x
      放弃
    4. ;.;.;.;.
      冲洗并重复

    你会看到,一旦你掌握了块视觉模式的窍门,你就会开始在任何地方使用它。哦,在您的工具箱中获取 .(以及 ;,),以便快速、通用(运动)重复!


    【讨论】:

    • 能否请一位反对者发表评论?我很确定一次性我可以比其他任何答案都快很多
    • 代替10000jggw<c-v>Gw 你可以在执行任何操作之前执行set nostartofline。然后只需执行G 即可移至文件底部。 (最终减少 1 个 w)
    • @FDinoff 我可能最终会开始使用它,因为光标跳跃很烦人。但是,必须记住大约 1 个额外喜欢的设置也不是没有负担。谢谢提醒,我需要重新考虑这个。
    • 本着“一张图说一千个字”的精神,我做了一个演示:)
    • 请注意,您可以使用d<c-v>G 代替<c-v>Gd。他们是一样的。但是dvjvjd 不一样:第一个不包括最后一个字符。
    【解决方案2】:

    简单的 awk 解决方案...

    awk '{ print $1"      0x"$2$3$4$5$6$7; }' input.txt
    

    【讨论】:

    • 请注意,此行会将 col1 和 col2 之间的分隔符更改为单个空格。另外,幸运的是您的文件只有 7 列,而不是 700 列。
    • 这是一个非常脆弱的解决方案。如果有一天您的文件中有 2 个额外的列怎么办?
    • 我说的很简单。 =P OP 是一个初学者,所以我认为通过在他们似乎不需要担心的情​​况下增加复杂性来使命令复杂化并不是一个好主意。至于空格,我最初放了六个,但看起来 Stack Overflow 降价删除了额外内容。
    【解决方案3】:

    vim 的另一种可能性:

    • 转到第二列:W
    • 选择所有列:`Ctrl-V G $
    • 删除选定区域内的空格::'<,'>s/\%V //g(当您点击冒号时,'<,'> 会因为可视模式而自动插入,并且在一个模式中,\%V 是一个零宽度匹配但仅在可视区域内)李>
    • 重新选择:gv
    • 插入 0x:I0xEsc
    • 保存:ZZ

    总共 23 次击键。

    【讨论】:

      【解决方案4】:

      这可能对你有用(GNU sed):

      sed 's/\s/&0x/;s/\s//2g' file
      

      【讨论】:

        【解决方案5】:

        Vim 解决方案

        没有什么花哨的,只需捕获六组两个十六进制数字并将它们按您想要的顺序放置。

        :%s/\v(\x\x)\s(\x\x)\s(\x\x)\s(\x\x)\s(\x\x)\s(\x\x)$/0x\1\2\3\4\5\6
        

        我得到这个作为输出

        0x5212cb03ca115ac0      0x3665fb5f1ac1
        0x5212cb03ca115cc0      0x3665fb5f1ac7
        0x5212cb03ca115ea0      0x3665fb5f1acd
        0x5212cb03ca1160c0      0x3665fb5f1ad3
        0x5212cb03ca1162a0      0x3665fb5f1ad9
        0x5212cb03ca1164c0      0x3665fb5f1ade
        0x5212cb03ca1166a0      0x3665fb5f1ae4
        0x5212cb03ca1168a0      0x3665fb5f1aea
        0x5212cb03ca116aa0      0x3665fb5f1af0
        0x5212cb03ca116ca0      0x3665fb5f1af6
        0x5212cb03ca116ea0      0x3665fb5f1afc
        0x5212cb03ca1170a0      0x3665fb5f1b02
        0x5212cb03ca117280      0x3665fb5f1b08
        0x5212cb03ca117480      0x3665fb5f1b0e
        0x5212cb03ca117680      0x3665fb5f1b14
        

        由于您在分隔列中使用制表符而不是空格,因此您可以从文件中删除所有空格。

        :%s/ //g
        

        并在第一个标签后添加0x

        :%s/\t/\t0x
        

        或者一起

        :%s/ //g|%s/\t/\t0x
        

        【讨论】:

        • 我不想删除两行之间的空格
        • @liv2hak 你试过了吗?它不会删除它们之间的空间,它看起来就像您的预期输出一样。
        • 我试过了。它确实删除了它们之间的空间。它不会删除最后一个空间。 '0x5212cb03cca0590x003665fb66ba c2'
        • @liv2hak 你的文件中有标签,不是吗?这就是我的东西对你不起作用的原因。
        【解决方案6】:

        如果你喜欢在 vim 中做:

        %s/\s\s\zs\S.*/\='0x'.substitute(submatch(0),'\s',"","g")/
        

        会做好的

        【讨论】:

          【解决方案7】:

          有替换:

          :%s/\w\zs\s\ze\w//g
          :%s/\s\+\zs/0x/
          

          或全部:

          :%s/\w\zs\s\ze\w//g|%s/\s\+\zs/0x/
          

          【讨论】:

            【解决方案8】:

            试试这个 awk:

            awk 'NR==1{for(i=2; i<=NF; i++) s=s$i; $0=$1 OFS "0x" s}1' OFS='\t' file
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-24
              • 1970-01-01
              • 2022-01-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多