我被困住了。假设我有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}' file
,awk -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$
并且任何建议的解决方案都不起作用。
答案 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