使用awk替换行尾的空字段

时间:2014-11-14 10:08:06

标签: bash awk gsub string-substitution

我被困住了。假设我有4个列的制表符分隔文件。

A326931873  2014-10-26 09:55:28.000 N06 D00030131051410
A326931902  2014-10-26 09:56:10.000 N06 

并希望用\ N替换行尾的空字段。结果应该是

A326931873  2014-10-26 09:55:28.000 N06 D00030131051410
A326931902  2014-10-26 09:56:10.000 N06 \N

我尝试了awk -F'\t' 'BEGIN {sub("", "\N", $4); print}' fileawk -F'\t' 'BEGIN {sub(/^&/, "\N", $4); print}' file,但没有运气。

Update1 :根据建议我也尝试使用多个字段,但awk -F"\t" 'NF<4 {print}' file没有返回结果,即所有行都有四个字段。

Update2 cat -vET file显示

A326931873^I2014-10-26 09:55:28.000^IN06^ID00030131051410^M$
A326931902^I2014-10-26 09:56:10.000^IN06^I^M$

Update3 :删除回车后cat -vET file显示

A326931873^I2014-10-26 09:55:28.000^IN06^ID00030131051410$
A326931902^I2014-10-26 09:56:10.000^IN06^I$

并且任何建议的解决方案都不起作用。

4 个答案:

答案 0 :(得分:2)

我认为对于空$4行,有一个尾随<tab> 试试这一行:

awk -F'\t' '$NF=!$NF?"\\N":$NF' file

如果空字段前没有<tab>

awk -F'\t' -v OFS="\t" 'NF==3{$4="\\N"}7' file

答案 1 :(得分:1)

如果您知道应该有多少字段,则可以将该值提供给脚本。

然后,如果当前行的字段较少,您可以将此给定文本作为最后一行附加:

awk -v fields=5 -F"\t" 'NF<fields {$fields="\\N"} 1' file

对于您的给定输入,它返回:

A326931873 2014-10-26 09:55:28.000 N06 D00030131051410
A326931902 2014-10-26 09:56:10.000 N06 \N

注意:

  • 这是有效的,因为NF代表 N f 字段,因此它表示当前行有多少字段。
  • 我们必须说$fields="\\N"因为\需要转义以便妥善处理。否则,如果您只使用\N,则可能会出现如下错误:
  

警告:转义序列\N' treated as plain N'

答案 2 :(得分:1)

您可以使用非常简单的格式,例如

$ awk 'NF<5{$5="\\N"}1' temp
A326931873  2014-10-26 09:55:28.000 N06 D00030131051410
A326931902 2014-10-26 09:56:10.000 N06 \N

答案 3 :(得分:0)

所以我自己找到了答案awk -F'\t' -v OFS='\t' 'length($4)==1{$4="\N"}1' file