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

除了第一个匹配的图案外

  •  1
  • Lucil120  · 技术社区  · 7 年前

    我知道如何在awk、gred、sed中转投,但除了第一场比赛外,我不知道如何转投。我在doc中搜索了一下,但找不到正确的命令。 我有这样一个简单的文件:

    tongtha AL_Vcs abcdef
    tongtha AL_Vcs abcdef
    tongtha AL_Vcs abcdef
    
    tuanngu AL_Ptime HEO
    tuanngu AL_Ptime HEO
    
    vuau AL_Ptime E2x
    vuau AL_verdi_b E2x
    vuau AL_TShell EU2HL
    

    这是我的愿望

    tongtha AL_Vcs abcdef
            AL_Vcs abcdef
            AL_Vcs abcdef
    
    tuanngu AL_Ptime HEO
            AL_Ptime HEO
    
    vuau AL_Ptime E2x
         AL_verdi_b E2x
         AL_TShell EU2HL
    

    如果我能把它分为2美元,而不仅仅是1美元,那就更好了

    tongtha AL_Vcs abcdef
                   abcdef
                   abcdef
    
    tuanngu AL_Ptime HEO
                     HEO
    
    vuau AL_Ptime E2x
         AL_verdi_b E2x
         AL_TShell EU2HL
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   John1024 David C. Rankin    7 年前

    用空格替换第一列,但不在第一个匹配项上

    $ awk '{save=$1} $1==last{gsub(/./," ",$1)} {last=save} 1' file
    tongtha AL_Vcs abcdef
            AL_Vcs abcdef
            AL_Vcs abcdef
    
    tuanngu AL_Ptime HEO
            AL_Ptime HEO
    
    vuau AL_Ptime E2x
         AL_verdi_b E2x
         AL_TShell EU2HL
    

    工作原理

    • save=$1

      这将在变量中保存第一列的值 save .

    • $1==last{gsub(/./," ",$1)}

      如果第一列与变量相同 last ,然后我们用相同数量的空格替换第一列。

    • last=save

      这将更新变量 最后的 在任何替换之前,第一列具有该值。

    • 1

      这是awk对打印行的隐晦速记。

    替换前两列,但不替换第一个匹配项

    要对前两列执行相同操作:

    $ awk '{save=$1} $1==last{gsub(/./," ",$1); gsub(/./," ",$2)} {last=save} 1' file
    tongtha AL_Vcs abcdef
                   abcdef
                   abcdef
    
    tuanngu AL_Ptime HEO
                     HEO
    
    vuau AL_Ptime E2x
                    E2x
                   EU2HL
    
        2
  •  1
  •   potong    7 年前

    这可能适用于您(GNU-sed):

    sed -r ':a;N;/^(\S+\s+\S+\s+)(.*\n)\1/{:b;s//\1\n\2\1\n/;h;s/\n.*//;s/./ /g;H;g;s/\n(.*\n).*\n(.*)\n(.*)$/\1\3\2/;ba};/^(\S+\s+)(.*\n)\1/bb;$b;/\n\s*$/b;h;s/\n[^\n]*$//p;g;s/.*\n//;ba' file
    

    sed脚本一次打印几组行。该脚本首先测试重复的第一个和第二个字段,然后使用通用解决方案将这些字段替换为空格。如果第一个测试失败,则脚本将尝试仅匹配第一个字段,如果成功,则使用与上述相同的解决方案。