2015-10-07 88 views
-4

我有一個製表符分隔的結果文件,其中包含數千行結果的行。 每一行都包含數百個不同變量的形式如下:如何使用bash在文本文件中查找特定變量的值

50001=1 50002=45 50003=-34 50004=MATCH 50005=0.2354 
50001=0 50002=167 50003=5 50004=NO_MATCH 50005=2.65 

我需要一個bash腳本去了該文件,並收集一個特定變量的所有值和出場次數,例如:

50004 - 1000 appearances total. 
MATCH - 600 appearances. 
NO_MATCH - 200 appearances. 
PARTIAL_MATCH - 200 appearances 

在此先感謝!

+0

我刪除了「...」 - 這只是爲了闡明,有數百個變量的例子後, 。關於邏輯,只要腳本收集到答案並讓我分析它們,我就不會在意。 –

+0

你想要顯示右側值的統計信息?或左手代碼?或兩者? –

回答

0

一個可能的解決方案可能是:

## replace with 'cat your_data_file' 
function show_data { 
cat << EOM 
50001=1 50002=45 50003=-34 50004=MATCH 50005=0.2354 
50001=0 50002=167 50003=5 50004=NO_MATCH 50005=2.65 
EOM 
} 
## include '=' sign to avoid '-' issue 
function simple_grep { 
show_data | grep -c "=${RHV}" 
} 
## change '-' to wildcard '?' otherwise error if '-' first char 
function mod_grep { 
show_data | grep -c "${RHV/-/?}" 
} 
## 

## option to show matches so you can confirm 
if [[ "$1" == "show_matches" ]] ; then SHOW_MATCH=1 ; shift ; fi 
## which grep solution to use 
if [[ "$1" == "mod" ]] ; then USE_MOD=1 ; shift ; fi 

### change ' ' to '\t' if tab-delimited 
### create unique list of 'right-hand' values 
for RHV in $(show_data | tr ' ' '\n' | awk -F '=' '{print $2}' | sort | uniq) 
do 
     printf "%15s | " ${RHV} 
     if [[ ${USE_MOD} ]] 
     then 
       mod_grep 
     else 
       simple_grep 
     fi 
     if [[ ${SHOW_MATCH} ]] ; then show_data | grep "${RHV/-/?}" ; echo "##" ; fi 
done 

:)
戴爾

+0

謝謝戴爾!你讓我的一天......我的一週! :) –

相關問題