我正在尝试转换一个文件,每列之间有两个或多个空格。
YP_010083342.1 - 258 VOG00003 - 582 8.6e-22 80.7 0.2 1 1 5.3e-25 1e-21 80.4 0.2 193 363 5 185 1 251 0.60 anti-repressor protein [Staphylococcus phage LH1]
我想使用sed将其转换为csv。下面的sed命令对文件没有明显的更改。
sed -i 's/s+/,/g' file.ouput
sed -i 's/$s+/,/g' file.ouput
sed -i 's/t+/,/g' file.ouput
sed -i 's/$t+/,/g' file.ouput
,但是下面的命令会产生以下
sed -i 's/ss/,/g' file.ouput
YP_010083342.1,,, -,,,,,,258 VOG00003,,,,,, -,,,,,,582, 8.6e-22, 80.7, 0.2, 1, 1, 5.3e-25,, 1e-21, 80.4, 0.2, 193, 363,, 5, 185,, 1, 251 0.60 anti-repressor protein [Staphylococcus phage LH1]
有谁能解释为什么会发生这种情况以及如何正确解决这个问题?
您可以使用此sed
:
sed -E 's/ {2,}/,/g' file
YP_010083342.1,-,258 VOG00003,-,582,8.6e-22,80.7,0.2,1,1,5.3e-25,1e-21,80.4,0.2,193,363,5,185,1,251 0.60 anti-repressor protein [Staphylococcus phage LH1]
或者这个awk
:
awk -F ' {2,}' -v OFS=, '{$1=$1} 1' ff
问题是+
是扩展正则表达式的一部分,必须使用sed -r
(或-E
)启用。一些种子(如GNU sed)也在基本正则表达式中支持它作为扩展,但必须进行转义:+
。顺便说一下,s
也是一个扩展。
假设GNU使用,这些都可以工作:
sed -i 's/ss+/,/g' file.output
sed -E -i 's/ss+/,/g' file.output
sed -E -i 's/s{2,}/,/g' file.output
更可移植,使用任何sed(将输出重定向到另一个文件,然后重命名):
sed 's/[[:blank:]]{2,}/,/g' file.output