如何用值替换tsv中的空字符串?

时间:2015-05-07 19:00:56

标签: unix

我有一个tsv,file1,其结构如下:

col1  col2  col3
1     4     3
22    0     8
3           5

如果打印出来的话,最后一行看起来像3\t\t5。我想用'NA'替换那个空字符串,这样该行就是3\tNA\t5。使用命令行最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

直接的方法是

sed -i 's/^\t/NA\t/;s/\t$/\tNA/;:0 s/\t\t/\tNA\t/;t0' file
  • sed -i编辑文件;

  • s/a/b/a替换为b;

  • s/^\t/\tNA/使用\t替换行尾的NA\t (第一列变为NA);

  • s/\t$/\tNA/最后一列相同;

  • s/\t\t/\tNA\t/NA;

  • 之间插入\t\t
  • :0 s///; t0如果有替换请重复s///(如果该行中还有其他缺失值)。

答案 1 :(得分:2)

awk专为这种情况而设计(在其他一百万人中;-))

  awk -F"\t" -v OFS="\t" '{
       for (i=1;i<=NF;i++) {
         if ($i == "") $i="NA"
       }
       print $0
 }' file > file.new && mv file.new file

-F="\t"表示字段分隔符(在FS内部也称为awk)是制表符。我们还将输出字段分隔符(OFS)设置为"\t"

NF是一行数据中的字段数。对于介于1和$i之间的每个值,$1, $2, $3, ...的评估结果为NF

我们测试$i th元素是否为if ($i == "")为空,如果是,我们将$i th元素更改为包含字符串“NA”。

对于每行输入,我们打印行的($0)值。

awk脚本之外,我们将输出写入临时文件,即file > file.new&&测试awk脚本没有错误地进行测试,如果正常,则将file.new移到原始文件上。根据项目所需的安全和安全用例,您可能不希望“销毁”原始文件。

IHTH。