2015-10-07 84 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

谢谢戴尔!你让我的一天......我的一周! :) –

相关问题