我想要達到的目標:
- grep:提取具有重疊群數和長度的行
- awk:從第 2 列中洗掉“長度:”
- sort:按長度排序(降序)
當前代碼
grep "length:" test_reads.fa.contigs.vcake_output | awk -F:'{print $2}' |sort -g -r > contig.txt
示例內容test_reads.fa.contigs.vcake_output:
>Contig_11 length:42
ACTCTGAGTGATCTTGGCGTAATAGGCCTGCTTAATGATCGT
>Contig_0 length:99995
ATTTATGCCGTTGGCCACGAATTCAGAATCATATTA
預期產出
>Contig_0 99995
>Contig_11 42
uj5u.com熱心網友回復:
使用您顯示的示例,請在此處嘗試以下awk sort解決方案。
awk -F'[: ]' '/^>/{print $1,$3}' Input_file | sort -nrk2
說明:簡單的解釋是,運行awk程式首先讀取 Input_file,其中將欄位分隔符設定為:OR 空格并檢查條件是否從行開始,>然后列印其第一個和第二個欄位,然后將其輸出(作為標準輸入)發送到對其sort進行排序的命令從第二個欄位獲得所需的輸出。
uj5u.com熱心網友回復:
假設:
- 如果多于一行具有相同的長度,則另外使用“版本”排序對第一列進行排序
在示例輸入中添加一些額外的行:
$ cat test_reads.fa.contigs.vcake_output
>Contig_0 length:99995
ATTTATGCCGTTGGCCACGAATTCAGAATCATATTA
>Contig_11 length:42
ACTCTGAGTGATCTTGGCGTAATAGGCCTGCTTAATGATCGT
>Contig_17 length:93
ACTCTGAGTGATCTTGGCGTAATAGGCCTGCTTAATGATCGT
>Contig_837 ignore-this-length:1000000
ACTCTGAGTGATCTTGGCGTAATAGGCCTGCTTAATGATCGT
>Contig_8 length:42
ACTCTGAGTGATCTTGGCGTAATAGGCCTGCTTAATGATCGT
一個sed/sort想法:
$ sed -rn 's/(>[^ ] ) length:(.*)$/\1 \2/p' test_reads.fa.contigs.vcake_output | sort -k2,2nr -k1,1V
在哪里:
-En- 啟用擴展的正則運算式支持并抑制輸入資料的正常列印(>[^ ]) )- (第一個捕獲組)->后跟 1 個或多個非空格字符length:- 空格后跟length:(.*)- (第二個捕獲組) - 0 個或多個字符(冒號之后)$- 行結束\1 \2/p- 列印第一個捕獲組<space>第二個捕獲組-k2,2nr- 按倒數順序按第二個(空格分隔)欄位r排序n-k1,1VV- 按ersion 順序按第一個(空格分隔)欄位排序
這會產生:
>Contig_0 99995
>Contig_17 93
>Contig_8 42
>Contig_11 42
uj5u.com熱心網友回復:
也許這結合了 grep 和 awk:
awk -F '[ :]' '$2 == "length" {print $1, $3}' file | sort ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/466157.html
上一篇:如何將多行字串轉換為陣列并用bash回顯特定的索引值?
下一篇:用于組合鍵值對更改的腳本
