我有一个tsv,file1,其结构如下:
col1 col2 col3
1 4 3
22 0 8
3 5
如果打印出来的话,最后一行看起来像3\t\t5
。我想用'NA'替换那个空字符串,这样该行就是3\tNA\t5
。使用命令行最简单的方法是什么?
答案 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。