我的输入是:
TGCCTCAGTTCAGCAGGAACAGT_1 __not_aligned
CGCCCGATCTCGTCTGATCTCG_0 __too_low_aQual
TTTTAACGCGGACCAGAAACTA_2 __not_aligned
TACCGTGTAGAACCGAATTTGT_69 mir-10
AGGAAGCCCTGGAGGGGCTGGAGA_0 mir-671我希望输出为:
__not_aligned 1
__too_low_aQual 0
__not_aligned 2
mir-10 69
mir-671 0我试图使用cut函数,但我不确定如何切换列以及如何获得特定的输出?
cut -d _ -f 发布于 2015-09-22 20:34:48
你可以用gawk尝试一下:
awk '{match($1,"[0-9]+",a)}{print $2,a[0]}' file输出:
__not_aligned 1
__too_low_aQual 0
__not_aligned 2
mir-10 69
mir-671 0或者使用POSIX更好(感谢Ed Morton):
awk --posix '{match($1,/[0-9]+/);print $2,substr($0,RSTART,RLENGTH)}' file发布于 2015-09-22 21:12:49
$ awk '{sub(/[^_]+_/,""); print $2, $1}' file
__not_aligned 1
__too_low_aQual 0
__not_aligned 2
mir-10 69
mir-671 0。
$ sed -r 's/[^_]+_([0-9]+)[[:space:]]+(.*)/\2 \1/' file
__not_aligned 1
__too_low_aQual 0
__not_aligned 2
mir-10 69
mir-671 0发布于 2015-09-23 00:46:33
如果Perl是一个选项:
perl -lne 'if (/^([ACGT]+)_(\d+)\s+(.*)/){print "$3 $2"}' file将3个字段捕获到正则表达式中:
^([ACGT]+)以一个或多个ACGT base开头,后跟下划线
(\d+)一个或多个数字,后跟\s+空格
(.*) anything
如果正则表达式匹配,则打印第三个字段和第二个字段
https://stackoverflow.com/questions/32716701
复制相似问题