在Bash中替换具有不同值/字符的空白单元格

时间:2015-06-05 14:46:15

标签: bash

我有一个大数据(> 20G),格式为:

chr snp beta    sebeta  f.stat  p.value error   warning
1   x1  1       1.1     1.5 
1   x2  2       1.2     1.6      0.1    NA      NA
1   x3  3       1.3     1.7      0.2    NA      NA
1   x4  4       1.4     1.8      0.3    NA      NA

由于某些原因,最后三个单元格的某些行是空白的。对于这些情况,我会用" 1"替换空白单元格。对于p.value," NA",对于error和"不可估量"为warning。我想知道如何在BASH中实现这一点,如:

chr snp beta    sebeta  f.stat  p.value error   warning
1   x1  1       1.1     1.5      1      NA      NOT ESTIMABLE
1   x2  2       1.2     1.6      0.1    NA      NA
1   x3  3       1.3     1.7      0.2    NA      NA
1   x4  4       1.4     1.8      0.3    NA      NA

我的平台是Mac OS X 10.9.5终端。

1 个答案:

答案 0 :(得分:1)

我会选择这样的东西:

awk -v OFS='\t' '{ if (NF==5) print $0, 1, "NA", "NOT ESTIMABLE"; else print }' file

如果字段数为5,则添加列,否则按原样打印行。我已将输出字段分隔符OFS设置为制表符,以便输出中的每列都以制表符分隔。

实现相同输出的略微缩短的方式如下:

awk -F'\t' 'NF == 5 { $0 = $0 FS 1 FS "NA" FS "NOT ESTIMABLE" }1' file

当字段数为5时,这会向行添加额外的字段。最后的1是一个常见的简写,它会导致awk打印每一行。此方法假定输入中的每个字段由制表符分隔,并使用FS的值来分隔其他字段。