2013-12-11 25 views
2

我有以下數據。使用sed或VIM替換空間新行

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和基因術語組成。

回答

6

在Vim中,我這樣做:

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

^M通過按,然後按Enter/Return鍵控制-V(在Windows控制-Q)類型。

這假定令牌之間有單個空格;正如@Floris所建議的那樣,您可以使用s/ \+/^M/g將多個連續空格轉換爲一個換行符。或者您可以使用s/\v\s+/^M/g來對包括製表符和文字空格字符在內的任何連續空格做同樣的事情。

+2

只要有一個空間,這將工作。第一個命令可能需要'%s/\ +/^ M/g'?它處理額外的空白。 – Floris

1

使用sed:s/ /\n/g; s/_at\n/_at /g 可能有一個更優雅的解決方案,但這一個將做。

+1

看起來很優雅,但在我的版本的'sed'(Mac OS)\ n'不被識別。 – Floris

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)。

+0

在VIM中可以使用它嗎? 我在VIM可視化模式下試過這個,但是失敗 ':'<,'>!sed sed's/\([^] * \)\(。[^] * \)/ \ 1 \ 2 \ ENTER', '/ g'' – pdubois

+0

在bash或其他POSIX shell中,你也可以利用POSIX字符串並輸入'$'... \\\ n/g'' –

+0

@MarkReed - 換行符的三個反斜槓?你可以解釋嗎?請? – Floris

1

爲你的榜樣,

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

這允許任何「空間」作爲分隔符,並在一個或多個出現時的最後一行沒有\ n。在字符串的任何部分被_at終止之後,這取1個「單詞」,而不是單詞的交替(從我這邊解釋)。

這並不避免2「_at」是在2個單獨的行寫(情況下,存在一個丟失/空字)

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 
1

您可以使用此尋找到的第一個字與「_at」

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

結束所有2字對,或者把一個換行符後每2字:

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