Bash 使用awk替换行末尾的空字段
我被卡住了。假设我有一个4列的选项卡分隔文件Bash 使用awk替换行末尾的空字段,bash,awk,gsub,string-substitution,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-
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''开始{sub(“,”\N“,$4);打印}文件
,awk-F'\t''开始{sub(/^&/,“\N”,$4);打印}文件
,诸如此类,运气都不好
Update1:正如我建议的那样,我也尝试使用了大量字段,但是
awk-F“\t”NF我假设对于带有空$4
的行,有一个尾随
试试这句话:
awk -F'\t' '$NF=!$NF?"\\N":$NF' file
如果空字段前没有
:
awk -F'\t' -v OFS="\t" 'NF==3{$4="\\N"}7' file
我假设对于$4
为空的行,后面有一个
试试这句话:
awk -F'\t' '$NF=!$NF?"\\N":$NF' file
如果空字段前没有
:
awk -F'\t' -v OFS="\t" 'NF==3{$4="\\N"}7' file
如果您知道应该有多少字段,则可以向脚本提供该值
然后,如果当前行的字段较少,您可以将此给定文本作为最后一个追加:
awk -v fields=5 -F"\t" 'NF<fields {$fields="\\N"} 1' file
注:
- 这是因为
NF
代表Nfield的数量,因此它表示当前行有多少字段
- 我们必须说
$fields=“\\N”
,因为\
需要转义才能正确处理。否则,如果只使用\N
,可能会出现如下错误:
警告:转义序列\N'被视为普通
如果您知道应该有多少字段,则可以向脚本提供该值
然后,如果当前行的字段较少,您可以将此给定文本作为最后一个追加:
awk -v fields=5 -F"\t" 'NF<fields {$fields="\\N"} 1' file
注:
- 这是因为
NF
代表Nfield的数量,因此它表示当前行有多少字段
- 我们必须说
$fields=“\\N”
,因为\
需要转义才能正确处理。否则,如果只使用\N
,可能会出现如下错误:
警告:转义序列\N'被视为普通
您可以使用非常简单的格式,如
$ 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
$awk'NF您可以使用非常简单的格式,如
$ 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
$awk'NF所以我自己找到了答案awk-F'\t'-vofs='\t''长度($4)==1{$4=“\N'}1'文件
所以我自己找到了答案awk-F'\t'-vofs='\t''长度($4)==1{$4=“\N'}1'文件
你有一个DOS文件。要使用它,您可以尝试使用dos2unix
。请检查此答案:。这不是解决方案中的问题,而是您的输入中的问题。用前面的链接清理它,也许你还有一个DOS文件。要使用它,您可以尝试使用dos2unix
。请检查此答案:。这不是解决方案中的问题,而是您的输入中的问题。用前面的链接清理它,我可能也怀疑$4=“\N”
是否有效。查看我的答案以了解为什么需要使用\\N
。我怀疑$4=“\N”
是否有效。查看我的答案以了解为什么需要使用\\N
。