将列中的空值替换为“UNKNOWN”

将列中的空值替换为“UNKNOWN”

我有一个制表符分隔的文件,其中有 3 列,我想用字符串“UNKNOWN”替换第二列中的空值。以下是文件的一部分:

MSTRG.1         0  
MSTRG.10        LOC102399924    331  
MSTRG.100       GINS4   108   
MSTRG.1000 UNKNOWN 0  
MSTRG.10000 UNKNOWN 0  
MSTRG.10001     BTBD19  86  
MSTRG.10002     TCTEX1D4        8  
MSTRG.10003     PLK3    627  
MSTRG.10004     LOC112585853    21996  
MSTRG.10005     LOC112585855    22  
MSTRG.10006     LOC112585856    1  
MSTRG.10007     LOC112585857    29  
MSTRG.10008     KIF2C   151  
MSTRG.10009     ARMH1   14  
MSTRG.1001 UNKNOWN 0  
MSTRG.10010 UNKNOWN 0  
MSTRG.10011     TMEM53  43  
MSTRG.10012     RNF220  4315  
MSTRG.10013     LOC112585696    100  
MSTRG.10014             234  
MSTRG.10015             918  
MSTRG.10016     DPH2    242  
MSTRG.10017     LOC112577732    705

我试过了awk -F'\t' '$2 && !$3{ $2="UNKNOWN" }1' file,但它并没有替换几行中的空白处。

编辑

根据评论中的要求,以下是同一文件的一部分,使用逗号代替制表符以提高可读性。我已使用 将制表符分隔的文件转换为 CSV sed 's/\t/,/'g

MSTRG.1,,0
MSTRG.10,LOC102399924,331
MSTRG.100,GINS4,108
MSTRG.1000,LOC112585730,0
MSTRG.10000,LOC112585902,0
MSTRG.10013,LOC112585696,100
MSTRG.10014,,234
MSTRG.10015,,918
MSTRG.10016,DPH2,242

答案1

此外steeldriver 的评论,这样应该可以正常工作,您也可以将连续的制表符 ( \t\t) 替换为被制表符 ( \tUNKNOWN\t) 包围的“UNKNOWN”。

  • sed

    sed -i 's/\t\t/\tUNKNOWN\t/' file
    
    • -i就地修改文件。
  • 版本awk> 4.1.0:

    awk -i inplace '{sub(/\t\t/, "\tUNKNOWN\t")}1' file
    
    • -i inplace就地修改文件。
    • 1最后只打印文件内容。
  • 对于awk版本 <4.1.0 的情况,该-i inplace选项不存在,因此,为了模仿-i inplace,您必须将文件保存到临时文件,然后将其重命名为当前文件:

    awk '{sub(/\t\t/, "\tUNKNOWN\t")}1' file > tmp && mv tmp file
    

相关内容