2017-07-26 111 views
1

我想知道是否可以在bash中使用awk或sed來執行此操作。檢查字符串的前4個字符或後4個字符以匹配字符串

我有以下示例文件:

HISEQ:272:CB0A0ANXX:3:1112:15781:21284_1:N:0:CATCAC 0 ITR3p_deleted 84279 41 35= * 0 0 TTAAGGAGGCTTCCTTTTCTAAACGATTGGGTGAG JJJ0JIIIIJJJJJJJJJJJJJJJJIJJJIHJJJJ NM:i:0 AM:i:41 
HISEQ:272:CB0A0ANXX:3:1115:13546:24638_1:N:0:CATCAC 16 ITR3p_deleted 84279 39 15= * 0 0 TTAAGGAGGCTTCCT BB/FFFF//FBBBBB NM:i:0 AM:i:39 
HISEQ:272:CB0A0ANXX:3:1114:4292:31240_1:N:0:CATCAC 16 ITR3p_deleted 83635 45 179= * 0 0 AGATCCTATTAGATACATAGATCCTCGTCGCGATATCGCATTTTCTAACGTGATGGATATATTAA BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIJIJJIJJJJJJJJ8JJJJJFFFFFFFFFFFFFFFFFFFFBFFFFFF<FFFFFFFFFFFFFFFFB<<FB<//<< NM:i:0 AM:i:45 
HISEQ:272:CB0A0ANXX:3:2104:14047:17929_1:N:0:CATCAC 16 ITR3p_deleted 84274 33 5X120= * 0 0 TAAGGTTAAGGAGGCTTCCTTTTCTAATAATGATATGTATCAATCGGTGTGTAGAAAGTGTTACATCGACTCATAATATTATATTT F7/FFFFBF77///F/7FF/<</</FBF</<<F</B//<//FFFFFFB/F/FBFBF//</F/F</F<<FBBFFFFFFFFFFFF<FFFBFFFFBFF<F<FFFB/F/FBFFFFFFFFFFBFB/</<< NM:i:5 AM:i:33 

我要檢查的第十列的字符串。如果它與前兩個示例中的TTAA一樣,我想將這些記錄提取到文件1中。如果在第三個例子中以TTAA結尾,我想將其提取到文件-2中。第四條記錄會被忽略。

似乎無法找到與awk匹配的字符串。

謝謝。

+1

請添加您嘗試使用awk的代碼...以匹配特定列,您可以使用'$ 10〜/^TTAA /'或'$ 10〜/ TTAA $ /'等 – Sundeep

+0

我在這裏看到很多ACTG。你在這裏做DNA測序嗎? – rigglesbee

+0

絕對,這是一個山姆文件格式。我正在嘗試的是識別已經映射了TTAA開始或結束的讀取。然後我想要計算基因組中每個TTAA位點的讀數量。有時TTAA發生在中間,我不想數這些。 –

回答

3

請嘗試以下操作。

awk '$10 ~ /^TTAA/{print > "file-1";next} $10 ~ /TTAA$/{print > "file-2"}' Input_file 
+1

我比你更喜歡你。這大約需要十分之一的時間。如果只有我更瞭解awk。 – rigglesbee

1

這應該做的伎倆:

cat samplefile.txt | while read line; do 
    if [[ $(echo "$line" | awk '{print $10}' | grep '^TTAA') ]]; then 
    echo "$line" >> file-1.txt 
    fi 
    if [[ $(echo "$line" | awk '{print $10}' | grep 'TTAA$') ]]; then 
    echo "$line" >> file-2.txt 
    fi  
done 
+0

這是一個非常好的方法,只需要清理某一列 –

0

這可能會爲你工作(GNU SED):

sed -rne '/^(\S+\s+){9}TTAA/w file1' -e '/^(\S+\s+){9}\S+TTAA\>/w file2' file 

調用的SED類似grep的性質和寫入依賴於單獨的文件正則表達式。

N.B.如果正則表達式匹配,則可以將一行寫入兩個輸出文件。