2013-10-30 152 views
1

我有文本文件,它看起來像如下所示:使用SED或AWK替換文本零

0 chr23:54039  0 54039 
0 chr23:103278 0 103278 
0 chr22:174609 0 174609 
0 chr22:54039  0 54039 
0 chr25:103278 0 103278 
0 chr25:174609 0 174609 
26 chr26:174609 0 174609 

如果第一列是「0」我需要在第一列與所述號替換0之後。所以,輸出應該是這樣的:

23 chr23:54039  0 54039 
23 chr23:103278 0 103278 
22 chr22:174609 0 174609 
22 chr22:54039  0 54039 
25 chr25:103278 0 103278 
25 chr25:174609 0 174609 
26 chr26:174609 0 174609 

任何人都可以提供簡單的sed或awk任何Linux解決方案嗎?

回答

3

使用sed:

$ sed -r '/^0/s/0(\s*chr)([^:]*)/\2\1\2/g' file 
23 chr23:54039  0 54039 
23 chr23:103278 0 103278 
22 chr22:174609 0 174609 
22 chr22:54039  0 54039 
25 chr25:103278 0 103278 
25 chr25:174609 0 174609 
26 chr26:174609 0 174609 

沒有-r

$ sed '/^0/s/0\(\s*chr\)\([^:]*\)/\2\1\2/g' file 
23 chr23:54039  0 54039 
23 chr23:103278 0 103278 
22 chr22:174609 0 174609 
22 chr22:54039  0 54039 
25 chr25:103278 0 103278 
25 chr25:174609 0 174609 
26 chr26:174609 0 174609 

的想法是,以取代線開始0。在那些中,0...chrNUM:...被捕獲並以期望的格式打印回來。

隨着awk

開始 0
$ awk '/^0/ {split($2,a,":"); gsub("chr", "", a[1]); $1=a[1]}1' file 
23 chr23:54039 0 54039 
23 chr23:103278 0 103278 
22 chr22:174609 0 174609 
22 chr22:54039 0 54039 
25 chr25:103278 0 103278 
25 chr25:174609 0 174609 
26 chr26:174609 0 174609 

鑑於線,所述第二字段是由:定界符破碎成片,然後chr文本是排除。然後準備將其存儲爲第一個字段。 1使條件成立,所以打印完整的新行。

+0

它不爲我工作!?? !! – SriniV

+0

@realspirituals檢查所有版本 – fedorqui

+0

太奇怪了,我沒有得到他們三個人的答案。我可能確實做錯了什麼。但我在ideone.com和我的linux系統上試過了。沒有什麼作品 – SriniV

6

如果在#1列數總是一樣chr號碼,您可以用做awk

awk '{split($2,a,":|chr");$1=a[2]}1' file 
23 chr23:54039 0 54039 
23 chr23:103278 0 103278 
22 chr22:174609 0 174609 
22 chr22:54039 0 54039 
25 chr25:103278 0 103278 
25 chr25:174609 0 174609 
26 chr26:174609 0 174609 
+0

這對我有用 – SriniV

+1

@Jotne:+1對awk使用的優雅和洞察力。我越學習awk,我就越喜歡它(能夠擁有多個分隔符,或者在這裏對':'或'「chr」''進行分割''),效率和功能都非常棒。) –

+1

@Oliver:Thank你爲了擡頭:)。 'awk'非常強大,當你認爲你看到最多的時候,它的一個新用法就會出現。 – Jotne

0
sed "s/^0[[:blank:]]\{1,\}chr\([0-9]\{1,\}\):/\1 chr\1:/"