[英]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.