2012-12-07 85 views
0

我想修改文件以打印第二列的一部分,並在它下面的行上顯示相應的序列。我已經嘗試了awk,sed和grep,但我只能看到部分文本。使用sed或awk修改文件中的文本

>hg19_ct_UserTrack_3545_(null) range=chr1:20802866-20802871 5'pad=0 3'pad=0 strand=+ repeatMasking=none 
GATAAG 
>hg19_ct_UserTrack_3545_(null) range=chr1:23866529-23866534 5'pad=0 3'pad=0 strand=+ repeatMasking=none 
TTATCT 
>hg19_ct_UserTrack_3545_(null) range=chr1:24345525-24345530 5'pad=0 3'pad=0 strand=+ repeatMasking=none 
GATAAG 

chr1 20802866 20802871 GATAAG 
chr1 23866529 23866534 TTATCT 
chr1 24345525 24345530 GATAAG 

回答

1
awk -F'[=: -]' '/^>/{s=$3" "$4" "$5; next} {print s,$0}' file 
1
$ sed 'N; s/.*range=\([[:alnum:]]*\):\([[:digit:]]*\)-\([[:digit:]]*\).*\n\([[:alpha:]]*\)/\1 \2 \3 \4/' test.fa 
chr1 20802866 20802871 GATAAG 
chr1 23866529 23866534 TTATCT 
chr1 24345525 24345530 GATAAG 
+0

你是個明星,謝謝謝謝! – user1879573

+0

@ user1879573 [沒問題](http://fuuu.us/395.png),順便說一句,您可以將答案標記爲[accepted](http://meta.stackexchange.com/a/5235/181223)如果它解決了你的問題。 –

1

另一種解決方案:

awk -F "[=: -]" '{getline a; print $3,$4,$5,a}' file 
+0

以上內容並不安全或恰當地使用getline。在閱讀並完全理解http://awk.info/?tip/getline之前,不要使用getline。 –

+0

@Ed Morton,你能解釋爲什麼我的例子不正確嗎?謝謝。 – Tedee12345

+0

我寫了那篇文章,所以我和其他人不必繼續解釋它。一旦你理解了那篇文章,你就不會再使用getline了。 getline是一個有用的工具,但awk的主要功能是讀取文件中的每一行並將條件/操作規則應用於每一行,所以使用getline來規避該行爲有點像攜帶自行車。 –