我的意见是:
"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
答案 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