拆分字符串和开关输出列

时间:2015-09-22 12:19:56

标签: awk cut

我的意见是:

"E6:N6,E8:N12,E14:N16,E18:N20,E23:N26,E28:N31,E33:N33,E35:N35,E37:N38,E40:N41,E43:N43,E45:N45,E47:N49,E52:N52,E55:N55,E58:N62,E64:N68,E70:N70,E72:N73,E76:N78,E80:N81"

我希望输出为:

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

5 个答案:

答案 0 :(得分:2)

您可以尝试使用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

答案 1 :(得分:1)

$ 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

答案 2 :(得分:0)

您可以尝试使用sed代替cut

sed 's/[ACGT]\+_\([0-9]\+\)[ \t]\+\([^ \t]\+\)/\2\t\1/g' file

你得到了

__not_aligned   1
__too_low_aQual 0
__not_aligned   2
mir-10  69
mir-671 0

答案 3 :(得分:0)

如果Perl是一个选项:

perl -lne 'if (/^([ACGT]+)_(\d+)\s+(.*)/){print "$3 $2"}' file

将3个字段捕获为正则表达式:
^([ACGT]+)从一个或多个ACGT基础开始,然后是下划线 (\d+)一个或多个数字,后跟\s+空格 (.*)任何事情

如果正则表达式匹配,则打印第3个字段和第2个字段

答案 4 :(得分:-1)

如果您真的想使用cut,请将其与paste结合使用以获得输出:

paste <(tr -s '\t ' < foo.txt | cut -f 2 -d ' ') <(cut -f 1 -d ' ' foo.txt | cut -f 2 -d _)

__not_aligned   1
__too_low_aQual 0
__not_aligned   2
mir-10  69
mir-671 0