awk gsub返回奇怪的结果

时间:2017-06-30 16:35:23

标签: unix awk

为初学者提问道歉。我似乎无法弄清楚这一点,我一直在寻找/黑客。以下是我的意见:

0000000000 AAAAA~~~000000000284~~~~~~~~~~ 123456793 2017/05/01
0000000001 BBBBBBBB000000000275~~~~~~~~~~ 123456789 2017/05/01
0000000002 CCCCCCCC0000~~~00276~~~~~~~~~~ 123456789 2017/05/01

我只是想把波浪号转换成插入符号。这是我的问题:

awk -v OFS='\t' '{ print $1, gsub(/~/,"^",$2), $3, $4 }' <${file1} >${file2}

输出如下:

0000000000  13  123456793   2017/05/01
0000000001  10  123456789   2017/05/01
0000000002  13  123456789   2017/05/01

几个问题:
1.我做错了什么? 2. 13和10值的含义是什么? 3.如果我更改为/~+/,则13和10更改为2和1,所以希望回答#2也会回答这个问题?
4.我看到一个awk示例,其中附加了1,因此:, $4 }1',这给出了50%的正确结果:

0000000000  13  123456793   2017/05/01
0000000000  AAAAA^^^000000000284^^^^^^^^^^  123456793   2017/05/01
0000000001  10  123456789   2017/05/01
0000000001  BBBBBBBB000000000275^^^^^^^^^^  123456789   2017/05/01
0000000002  13  123456789   2017/05/01
0000000002  CCCCCCCC0000^^^00276^^^^^^^^^^  123456789   2017/05/01

1是什么意思/做什么? 提前谢谢你 干杯

1 个答案:

答案 0 :(得分:3)

你快到了:

  
      
  1. 我做错了什么?
  2.   

您认为gsub函数返回字符串。但是,gsub函数会更改$2,但不会打印它。

引用https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

  

gsub()函数返回所做的替换次数。

这也回答了问题2和3。

  
      
  1. 这意味着什么/做什么?
  2.   

1是打印的快捷方式。

你所做的是印刷和替代的混合。您只需更改顺序:执行替换然后打印

awk -v OFS='\t' '{ gsub(/~/,"^",$2); print }' <f

或更短:

awk -v OFS='\t' '{ gsub(/~/,"^",$2)}1' <f