我有以下数据。
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和基因术语。
答案 0 :(得分:7)
在Vim中,我会这样做:
:%s/ /^M/g
:g/_at/j
通过按下control-V(Windows上的control-Q),然后按Enter / Return键来键入^M
。
这假定令牌之间有单个空格;正如@Floris建议的那样,您可以使用s/ \+/^M/g
将多个连续空格转换为单个换行符。或者您可以使用s/\v\s+/^M/g
对任何连续的空格执行相同的操作,包括制表符和文字空格字符。
答案 1 :(得分:2)
惊人但真实:
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
)。
答案 2 :(得分:1)
使用sed:s/ /\n/g; s/_at\n/_at /g
可能会有一个更优雅的解决方案,但这个解决方案可以做到。
答案 3 :(得分:1)
为您的例子,
sed -e 's/\(_at [0-9a-zA-Z−]*\) /\1\n/g'
答案 4 :(得分:1)
sed 's/\(_at[[:blank:]]\{1,\}[^[:blank:]\{1,\}\)\([[:blank:]]\)/\1\
\2/g' YourFile
这允许任何“空格”作为分隔符并且在一个或多个出现时,在最后一行没有\ n。在_at
终止字符串的任何部分之后,这需要1个“单词”,而不是单词的替代(从我这边解释)。
这不能避免2个“_at”写在2个单独的行上(如果有一个丢失/空字的话)
答案 5 :(得分:1)
以下是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
答案 6 :(得分:1)
您可以使用它来查找第一个单词以“_at”
结尾的所有双字对grep -oP '\S+_at\s+\S+' file
或者,在每个第二个单词之后加上换行符:
tr -s '[:blank:]' '\n' < file | paste -d " " - -