我有一个制表符分隔的文件,其中有 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