2012-12-07 51 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来规避该行为有点像携带自行车。 –