使用sed将带分隔符的文件转换为CSV



我正在尝试转换一个文件,每列之间有两个或多个空格。

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

相关内容

  • 没有找到相关文章

最新更新