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

如何在此awk脚本中排除原始的$0?

  •  0
  • zundarz  · 技术社区  · 7 年前

    这是我文件的摘录。注意,product\u id是

        <tr>
        <td product_id="LRZCQPLRQW">LRZCQPLRQW</td>
        <td>Crate</td>
        </tr>
        <tr>
        <td product_id="LRZCQPLRQW">LRZCQPLRQW</td>
        <td>Crate</td>
        </tr>
    

    我想通过浓缩使产品id独特

    下面的awk脚本完成了我需要的操作,但它也打印原始行 在新行下方。如果我排除 {print $0} ,那么我只得到 排。

    awk '/LRZ/ {x=NR; print substr($0,1,33) x substr($0,34,12) x substr($0,46);} {print $0}' my_file.html

    当前结果

        <tr>
        <td product_id="LRZCQPLRQW2">LRZCQPLRQW2</td>
        <td product_id="LRZCQPLRQW">LRZCQPLRQW</td>
        <td>Crate</td>
        </tr>
        <tr>
        <td product_id="LRZCQPLRQW6">LRZCQPLRQW6</td>
        <td product_id="LRZCQPLRQW">LRZCQPLRQW</td>
        <td>Crate</td>
        </tr>
    

    预期结果

        <tr>
        <td product_id="LRZCQPLRQW2">LRZCQPLRQW2</td>
        <td>Crate</td>
        </tr>
        <tr>
        <td product_id="LRZCQPLRQW6">LRZCQPLRQW6</td>
        <td>Crate</td>
        </tr>
    
    4 回复  |  直到 7 年前
        1
  •  4
  •   Ed Morton    7 年前

    我不知道为什么到目前为止答案这么复杂。这不是你所需要的吗?

    $ awk '{gsub(/LRZ[^"<]+/,"&"NR)}1' file
        <tr>
        <td product_id="LRZCQPLRQW2">LRZCQPLRQW2</td>
        <td>Crate</td>
        </tr>
        <tr>
        <td product_id="LRZCQPLRQW6">LRZCQPLRQW6</td>
        <td>Crate</td>
        </tr>
    
        2
  •  1
  •   jas    7 年前

    这个 next

     $ awk '/LRZ/ {print substr($0,1,33) NR substr($0,34,12) NR substr($0,46); next} {print $0}' file
       <tr>
       <td product_id="LRZCQPLRQW2">LRZCQPLRQW2</td>
       <td>Crate</td>
       </tr>
       <tr>
       <td product_id="LRZCQPLRQW6">LRZCQPLRQW6</td>
       <td>Crate</td>
       </tr>
    

    或者,如果愿意,您可以在希望按原样打印原始行时简单地取消图案:

    $ awk '/LRZ/ {print substr($0,1,33) NR substr($0,34,12) NR substr($0,46)}
          $0 !~ /LRZ/ {print $0}' file
       <tr>
       <td product_id="LRZCQPLRQW2">LRZCQPLRQW2</td>
       <td>Crate</td>
       </tr>
       <tr>
       <td product_id="LRZCQPLRQW6">LRZCQPLRQW6</td>
       <td>Crate</td>
       </tr>
    

    通常情况下,这将更习惯地写成:

    $ awk '/LRZ/ {print substr($0,1,33) NR substr($0,34,12) NR substr($0,46); next}1' file
    

    陈述和始终真实的模式 1

        3
  •  1
  •   paxdiablo    7 年前

    简单地说 next LRZ

    /LRZ/{x=NR;print substr($0,1,33) x substr($0,34,12) x substr($0,46);next}{print $0}
    
        4
  •  1
  •   RavinderSingh13 Nikita Bakshi    7 年前

    尝试跟随awk一次,不要在此处硬编码任何位值,只需替换“”和>&书信电报;。

    awk '/product_id/{sub(/\".[^"]*/,"&"NR);sub(/>.[^<]*/,"&"NR);} 1'  Input_file
    

    编辑:

    awk '/product_id/{sub(/\".[^"]*/,"&"NR);sub(/>.[^<]*/,"&"NR);} 1' Input_file
    <tr>
    <td product_id="LRZCQPLRQW2">LRZCQPLRQW2</td>
    <td>Crate</td>
    </tr>
    <tr>
    <td product_id="LRZCQPLRQW6">LRZCQPLRQW6</td>
    <td>Crate</td>
    </tr>