繁体   English   中英

使用 sed 或 VIM 用新行替换空格

[英]Using sed or VIM to replace space with new line

我有以下数据。

1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−−

使用sed或 VIM 编辑器如何将其更改为

1455931_at Chrna3 
1420468_at Asb17 
1445520_at −−− 
1436717_x_at Hbb−y 
1431788_at Fabp12 
1458975_at −−−

所以所有带有_at的单词将是每一行的第一个。 每行由成对的 _at 和基因项组成。

在 Vim 中,我会这样做:

:%s/ /^M/g
:g/_at/j

其中^M是通过按 control-V(Windows 上的 control-Q)然后按 Enter/Return 键来输入的。

这假设令牌之间有单个空格; 正如@Floris 建议的那样,您可以使用s/ \\+/^M/g将多个连续空格转换为单个换行符。 或者您可以使用s/\\v\\s+/^M/g对任何连续的空格(包括制表符和文字空格字符)执行相同的操作。

惊人但真实:

sed 's/\([^ ]*\) \(.[^ ]* \)/\1 \2\
> /g' <<<"1455931_at Chrna3 1420468_at Asb17 1445520_at −−− 1436717_x_at Hbb−y 1431788_at Fabp12 1458975_at −−−"
1455931_at Chrna3 
1420468_at Asb17 
1445520_at −−− 
1436717_x_at Hbb−y 
1431788_at Fabp12 
1458975_at −−−

换句话说,我使用的sed字符串中有一个物理回车( >是由控制台添加的):

sed 's/\([^ ]*\) \(.[^ ]* \)/\1 \2\
> /g'

您可以尝试使用其他表达式(现在我假设是平衡对,但如果您特别想匹配第一个字符串末尾的at ,则可以)。

使用 sed: s/ /\\n/g; s/_at\\n/_at /g s/ /\\n/g; s/_at\\n/_at /g可能有一个更优雅的解决方案,但这个解决方案可以。

对于你的例子,

sed -e 's/\(_at [0-9a-zA-Z−]*\) /\1\n/g'
sed 's/\(_at[[:blank:]]\{1,\}[^[:blank:]\{1,\}\)\([[:blank:]]\)/\1\
\2/g' YourFile

这允许任何“空格”作为分隔符,并且在一次或多次出现时,最后一行没有 \\n。 这在以_at终止的字符串的任何部分之后需要 1 个“单词”,而不是单词的交替(从我这边解释)。

这并不能避免将 2 个“_at”写在 2 个单独的行上(如果缺少/空字)

这是一个awk解决方案:

awk '{for (i=1;i<=NF;i+=2) print $i,$(i+1)}' file
1455931_at Chrna3
1420468_at Asb17
1445520_at ...
1436717_x_at Hbb.y
1431788_at Fabp12
1458975_at ...

这将打印两个和两个字段。

另一个版本:

awk '{printf $0 FS;getline;print}' RS=" " file

您可以使用它来查找第一个单词以“_at”结尾的所有 2 词对

grep -oP '\S+_at\s+\S+' file

或者,在每第二个单词后放置一个换行符:

tr -s '[:blank:]' '\n' < file | paste -d " " - -

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM