如何使用bash在文本文件中查找特定变量的值

时间:2015-10-07 06:34:01

标签: bash variables text

我有一个制表符分隔的结果文件,其中包含数千行结果。 每行包含以下形式的数百个不同变量:

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案可能是:

## 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

:)
戴尔