awk如果输出字段之一为空,如何打印“ NA”

时间:2019-12-04 20:26:21

标签: linux bash awk

如果输出列为空,我想打印'NA',

$cat file.txt
111||aa1|11a|key
|bbb|aa2|22a|key
333|ccc||33a|key
444|ddd||44a|key
555|eee|aa5|55a|key

如果我不懂,我会变得

$awk -F'|' '{print $1,$2,$3}' file.txt
111  aa1
 bbb aa2
333 ccc 
444 ddd 
555 eee aa5

但是我希望空白列中填充“ NA”,如下所示:

111 NA aa1
NA bbb aa2
333 ccc NA 
444 ddd NA
555 eee aa5

尝试:

$awk -F'|' '{print '!$1 $1="NA"}',$2,$3}' file.txt 
awk -F'|' '{print $1,if($2=="") $2="NA",$3}' file.txt

如果该字段为空,请帮助我填写“ NA”

4 个答案:

答案 0 :(得分:4)

您可以使用此awk

awk -F '|' '{sub(/^\|/, "NA|"); gsub(/\|\|/, "|NA|"); print $1, $2, $3}' file

111 NA aa1
NA bbb aa2
333 ccc NA
444 ddd NA
555 eee aa5

另一个变体:

awk -F '|' '{for(i=1; i<=3; i++) if ($i=="") $i="NA"; print $1, $2, $3}' file

111 NA aa1
NA bbb aa2
333 ccc NA
444 ddd NA
555 eee aa5

答案 1 :(得分:4)

$ awk -F'|' '{print f(1), f(2), f(3)} function f(n){return ($n=="" ? "NA" : $n)}' file
111 NA aa1
NA bbb aa2
333 ccc NA
444 ddd NA
555 eee aa5

答案 2 :(得分:1)

我认为没有惯用的方法,但是您可以使用三元运算符将其缩短一点:

awk -F'|' '{n="NA";print ($1!=""?$1:n),($2!=""?$2:n),($3!=""?$3:n)}' file.txt

输出:

111 NA aa1
NA bbb aa2
333 ccc NA
444 ddd NA
555 eee aa5

答案 3 :(得分:1)

另一个awk

awk -F'|' '{for(i=1;i<NF;i++)$i=$i!=""?$i:"NA";NF-=2}1' file
111 NA aa1
NA bbb aa2
333 ccc NA
444 ddd NA
555 eee aa5

最好添加一些括号:

awk -F'|' '{for(i=1;i<NF;i++)($i=$i!=""?$i:"NA");NF-=2}1' file