2015-09-22 19 views
1

我輸入的是:分割字符串和開關輸出列

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 -d _ -f 
+0

抱歉,更新.. – BioMan

回答

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(感謝埃德莫頓):

awk --posix '{match($1,/[0-9]+/);print $2,substr($0,RSTART,RLENGTH)}' file 
+0

AWK:語法在源極線1錯誤 上下文 \t >>> {比賽($ 1, 「[0-9] +」 <<< AWK:在源代碼行非法語句1 AWK:在源線1件 – BioMan

+0

對我的作品與GNU awk的非法聲明4.1.3在cygwin上。任何人都可以重現錯誤嗎? –

+0

文件中的第一行就像一個標題,也許這就是爲什麼:seq _ ../trimmed/94R.tally.fasta __not_aligned – BioMan

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 
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 
+1

我想出幾乎相同的awk單行'awk'{sub(/.*_/,""$$ 1); print $ 2,$ 1}''... up! – Kent

+0

爲什麼?我給'$ 1'作爲參數...不是$ 0 – Kent

-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 
0

如果Perl是一種選擇:

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

捕獲3場爲正則表達式:
^([ACGT]+)從一個或多個ACGT鹼基開始,後接下劃線
(\d+)一個或多個標記,隨後\s+空白
(.*)任何

如果正則表達式的匹配,打印第三字段和第二字段