我真的需要幫助的具體方法。
我有一個這樣的串列;
我有一個這樣的串列;
promoter-TSS (NM_004753)
內含子(NM_001013630,3個內含子的第2個)。
基因間
內含子(NM_001135610,7個內含子中的6個)。
基因間
基因間
基因間
內含子(NM_201628,14號內含子中的1號)。
例如,內含子在一行中要計算不止一次。 我想在一行中只計算每個詞一次。
對于上述串列,輸出應該是;
promoter count : 1
內含子數:3 #not 6
基因間數 : 5
通常情況下,我在命令列中操作這類txt檔案。 我需要為一個大的集合運行這個檔案,所以我真的需要幫助! 非常感謝你
uj5u.com熱心網友回復:
用awk:
$ awk -F'[ ] |-' '
{ counts[$1] }
END { for (c in counts) printf "%s count : %d
", c, counts[c] }' input.txt
基因間數 : 4
內含子計數:3
啟動子計數:1
uj5u.com熱心網友回復:
當第一個詞后面是-或空格時,你可以用
sed 's/[ -].*//' file | sort | uniq -c
uj5u.com熱心網友回復:
假設:
- 欄位以非字母數字為界(即,
^[:alnum:]) - 使用不區分大小寫的比較法 。
- 在OP的預期輸出中,
intergeneric計數應該是4 。
- 忽略空行 。
示例資料:
$ cat list.dat
啟動子-TSS (NM_004753)
內含子(NM_001013630,3個內含子的第2個)。
基因間期
內含子(NM_001135610,7個內含子中的6個)。
基因間
基因間
基因間
內含子(NM_201628,14個內含子中的1個) # 第一個字符的大小寫變化#空白行。
Intergenic7 e3u # first delimiter == " "
intron9(NM_201628, intron 1 of 14) # first delimiter == "(")
一個awk想法:
awk '
{ split($0,arr,"[^[:alnum:]]" ) # 使用所有非字母數字作為分隔符來分割行
if ( arr[1] != "" ) # 如果不是空行 ...
count[tolower(arr[1])] # 縮略語/計數第一個欄位
}
END { for (i in count) # 回圈瀏覽單詞串列
printf "%s count : %s
", i, count[i]
}
' list.dat
# 或者作為一個單行代碼(沒有注釋)。
awk '{split($0,arr,"[^[:alnum:]]"); if (arr[1] !="") count[tolower(arr[1])] } END {for (i in count) printf "%s count : %s
", i, count[i]}' list.dat
這就產生了:
intergenic7 count : 1
內含子9計數:1
內含子數 : 3
基因間數 : 4
啟動子數:1
注釋:
- 我們使用
tolower()來促進不區分大小寫的比較,所以所有輸出都是小寫的 。
- OP還沒有規定如何使用輸出,所以這個解決方案可以進一步修改,以考慮到顯示順序、保存到檔案、保存到關聯陣列等 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/308109.html
標籤:
