Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk替换行末尾的空字段_Bash_Awk_Gsub_String Substitution - Fatal编程技术网

Bash 使用awk替换行末尾的空字段

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-

我被卡住了。假设我有一个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''开始{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