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

时间:2017-08-23 13:36:02

标签: awk cygwin

在这里使用Cygwin64。

这是我文件的摘录。注意product_id是 不是唯一的。

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

我想通过连接使product_id独一无二 QW之后的rownumber。

以下awk脚本执行我需要的操作,但它也会打印原始行 在新行下方。如果我排除{print $0},那么我只会获得 product_id 行。

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 个答案:

答案 0 :(得分:4)

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

$ 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>

答案 1 :(得分:1)

如果您只想转到下一行输入,next语句将使awk继续执行操作:

 $ 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

使用next语句和始终为真的模式1,其默认操作是打印原始行。

答案 2 :(得分:1)

只需将next作为最终命令添加到LRZ处理部分,这将立即转到下一行:

/LRZ/{x=NR;print substr($0,1,33) x substr($0,34,12) x substr($0,46);next}{print $0}

答案 3 :(得分:1)

尝试关注awk一次,不要在此处硬编码任何位置值,只需替换“”和“&gt;”中的字母。

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

编辑:根据OP的请求在此处添加输出。

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>