【问题标题】:Replace empty field at the end of line using awk使用 awk 替换行尾的空字段
【发布时间】:2014-11-14 10:08:06
【问题描述】:

我被困住了。假设我有 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 没有返回任何结果,即所有行都有四个字段。

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

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

【问题讨论】:

标签: bash awk gsub string-substitution


【解决方案1】:

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

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

如果空字段前没有<tab>

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

【讨论】:

    【解决方案2】:

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

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

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

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

      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 代表 Nnumber of fields,因此它表示当前行有多少个字段。
      • 我们不得不说$fields="\\N",因为\ 需要转义才能正确处理。否则,如果您只使用\N,您可能会收到如下错误:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我怀疑$4="\N" 有效。请参阅我的回答以了解为什么需要使用 \\N
        猜你喜欢
        • 1970-01-01
        • 2016-10-29
        • 2017-10-27
        • 2017-11-22
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 2019-12-22
        • 2019-07-19
        相关资源
        最近更新 更多