0

我被困住了。假设我有 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同样没有运气。

更新1:正如建议的那样,我也尝试过使用字段数,但awk -F"\t" 'NF<4 {print}' file没有返回任何结果,即所有行都有四个字段。

更新2cat -vET file显示

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

更新3:删除回车后cat -vET file显示

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

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

4

4 回答 4

2

我假设对于空的行$4,有一个尾随的<tab> 尝试这一行:

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

如果<tab>空字段之前没有:

awk -F'\t' -v OFS="\t" 'NF==3{$4="\\N"}7' file
于 2014-11-14T10:16:37.620 回答
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代表字段数,因此它表示当前行有多少个字段。
  • 我们不得不说$fields="\\N",因为\需要转义才能正确处理。否则,如果您只使用\N,您可能会收到如下错误:

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

于 2014-11-14T10:18:22.107 回答
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
于 2014-11-14T10:18:24.247 回答
0

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

于 2014-11-14T12:15:46.127 回答