2016-10-16 22 views
0

到grep字符串一個列表我在這個格式的大數據文本文件(超過100,000行):shell腳本(帶環)由一個

0.000197239;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=CLCNKA;GeneDetail.refGene=.;ExonicFunc 
0.00118343;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=CLCNKA;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.00276134;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=CLCNKA;GeneDetail.refGene=.; 
0.0607495;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=CLCNKA;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.00670611;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=XDH;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.000197239;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=XDH;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.000394477;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=GRK4;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.0108481;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=GRK4;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.000394477;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=GRK4;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 
0.0108481;AN=192;NS=2535;ANNOVAR_DATE=2015-12-14;Func.refGene=exonic;Gene.refGene=GRK4;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV; 

現在,每一行中包含的基因名如在最初的4行中有CLCNKA基因。我使用grep命令計數每個基因名稱的頻率在這個數據文件中,如:

grep -w "CLCNKA" my_data_file | wc -l 

大約有300個基因在一個單獨的文件,它是在上述數據文件進行搜索。一些專家可以寫一個簡單的shell script帶循環,從列表中逐個獲取基因名稱,並將其頻率存儲在單獨的文件中。因此,輸出文件將是這樣的:

CLCNKA 4 
XDH 2 
GRK4 4 
+1

這對'awk'來說更是一份工作# –

+0

所以,你可以爲此建議'awk'命令,我也可以將標籤編輯爲'awk'。 –

+1

現在它已被正確標記,一些awk專家可能會幫助你。 –

回答

2

你迷惑我們。我和其他一些人認爲,所有你想要的是文件中的每個基因的數量,因爲這就是你的輸入/輸出和你的一些描述性的文字狀態(count the frequency of each gene name in this data file),這將僅僅是這樣的:

$ awk -F'[=;]' '{cnt[$11]++} END{for (gene in cnt) print gene, cnt[gene]}' file 
GRK4 4 
CLCNKA 4 
XDH 2 

,而其他人認爲你需要計算不同文件中存在的特定基因,因爲這就是你的主題行,提出的算法和其他文本狀態。

如果其他人是正確的,那麼你會需要這個調整首先閱讀「基因」的文件,只算上市的「基因」,在「文件」的基因:

awk -F'[=;]' 'NR==FNR{genes[$0]; next} $11 in genes{cnt[$11]++} END{for (gene in cnt) print gene, cnt[gene]}' genes file 
GRK4 4 
CLCNKA 4 
XDH 2 

你的榜樣沒有幫助,因爲它會產生相同的輸出結果或者解釋你的需求,所以編輯你的問題來澄清你想要的結果。特別是如果有不想計算的基因,請在樣本輸入中包含那些包含這些基因的行。

+1

感謝您的關心親愛的。是的,第二種情況是正確的,我想從一個單獨的文件中讀取「基因」,然後在上面顯示的「數據文件」中搜索並計算基因的出現。輸出如上所述是一個單獨的文件。 –

2

awk是你的朋友

awk '{sub(/^.*Gene\.refGene=/,"");sub(/;.*$/,""); 
    genelist[$0]++}END{for(i in genelist){print i,genelist[i]}}' file 

輸出

GRK4 4 
CLCNKA 4 
XDH 2 

旁註:這可能不會給你的基因名稱頻率按它們在文件中出現的順序排列。我想這不是一個需要。

0

這裏是一個班輪:

sed "s/.*Gene.refGene=//;s/\;.*//" test | sort | uniq -c | awk '{print $2,$1}' 

sed - 將刪除一切從線除了基因名
sort會做的名字
uniq -c排序 - 將計算基因的重複數
awk與交換uniq輸出(默認情況下它是:計數模式)

1

這也可以在純粹的bash的,通過使用associative array特徵計數頻率:

#!/bin/bash 

# declare assoc array 
declare -A freq 

# split stdin input csv 
for gene in $(cut -d ';' -f 6|cut -d = -f 2);do 
    let freq[$gene]++ 
done 

# loop over array keys 
for key in ${!freq[@]}; do 
    echo ${key} ${freq[$key]} 
done 
1

一種更簡單的解決方案依賴於uniq的命令:

#!/bin/bash 

cut -d ';' -f 6|cut -d = -f 2|sort|uniq -c|while read -a kv;do 
    echo ${kv[1]} ${kv[0]} 
done 
+1

不需要循環,也不需要2'cut's:'awk -F'[; =]''{print $ 11}'文件|排序| uniq -c | awk'{print $ 2,$ 1}''。不建議你這樣做,而不是1 awk命令當然 –

0

爲了保持順序提供的輸入文件被作爲在給定的排序樣品:

$ perl -lne ' 
($g) = /Gene\.refGene=([^;]+)/; 
if($g ne $p && $. > 1) 
{ 
    print "$p\t$c"; 
    $c = 0; 
} 
$c++; $p = $g; 
END { print "$p\t$c" }' ip.txt 
CLCNKA 4 
XDH  2 
GRK4 4 


如果沒有,使用的散列變量遞增基因名用作鍵和一個數組來存儲鍵順序

$ perl -lne ' 
($k) = /Gene\.refGene=([^;]+)/; 
push(@o, $k) if !$h{$k}++; 
END { print "$_\t$h{$_}" foreach (@o) }' ip.txt 
CLCNKA 4 
XDH  2 
GRK4 4 
0

如果你只搜索基因的列表,低效但是簡單的方法

read g; do echo -n $g " "; grep -c $g file; done < genes 

假設您的基因在基因文件中一次列出一個。

如果你的文件結構是固定的,更高效的版本將是

awk 'NR==FNR{genes[$1];next} 
      {sub(/Gene.refGene=/,"",$6)} 
$6 in genes{count[$6]++} 
     END{for(g in count) print g,count[g]}' genes FS=';' file