如何将空格转换为零值 (unix)
How to convert blank spaces to zero values (unix)
我有这个制表符分隔的文件内容:
Chr10_16 0.54 1.00
Chr10_51 1.00 1.00 1.00
Chr1_104 0.37 0.75 1.00
Chr1_105 0.94
Chr1_109 1.00
我想将其转换为:
Chr10_16 0 0.54 1.00
Chr10_51 1.00 1.00 1.00
Chr1_104 0.37 0.75 1.00
Chr1_105 0 0 0.94
Chr1_109 0 1.00 0
我尝试了不同的命令,但它们没有像我预期的那样工作。例如
awk 'BEGIN {FS = OFS = "\t"} {for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 0 }; 1'
或
tr '\t' '0'
有什么建议吗?
谢谢
你可以这样做:
sed -e 's/\t\t/\t0\t/g' -e 's/\t\t/\t0\t/g' -e 's/^\t/0\t/' -e 's/\t$/\t0/' file
也就是...
- 将所有出现的相邻制表符替换为夹在两个制表符之间的零
- 这需要完成两次,因为
sed
不会匹配替换的内容。因此,如果您有 3 个相邻的选项卡,否则只会填充两个空白中的一个。
- 如果以制表符开头,则在行首插入 0
- 如果以制表符结尾,则在行尾附加一个 0
我有这个制表符分隔的文件内容:
Chr10_16 0.54 1.00
Chr10_51 1.00 1.00 1.00
Chr1_104 0.37 0.75 1.00
Chr1_105 0.94
Chr1_109 1.00
我想将其转换为:
Chr10_16 0 0.54 1.00
Chr10_51 1.00 1.00 1.00
Chr1_104 0.37 0.75 1.00
Chr1_105 0 0 0.94
Chr1_109 0 1.00 0
我尝试了不同的命令,但它们没有像我预期的那样工作。例如
awk 'BEGIN {FS = OFS = "\t"} {for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 0 }; 1'
或
tr '\t' '0'
有什么建议吗? 谢谢
你可以这样做:
sed -e 's/\t\t/\t0\t/g' -e 's/\t\t/\t0\t/g' -e 's/^\t/0\t/' -e 's/\t$/\t0/' file
也就是...
- 将所有出现的相邻制表符替换为夹在两个制表符之间的零
- 这需要完成两次,因为
sed
不会匹配替换的内容。因此,如果您有 3 个相邻的选项卡,否则只会填充两个空白中的一个。
- 这需要完成两次,因为
- 如果以制表符开头,则在行首插入 0
- 如果以制表符结尾,则在行尾附加一个 0