2017-11-17 16 views
1

私は、パラメータ"B"で開始した場合は、私に(Bで始まる行からの)最大の数と行の色を与えることをするスクリプトを記述する必要があり、このファイルをbashのマトリックスに読み込むにはどうしたらいいですか?

A;green;3 
B;blue;2 
A;red;4 
C;red;2 
C;blue;3 
B;green;3 

のようなテキストファイルを持っています。この場合、最終行になるので、出力は"green"になります。

どのようにして";" -sと改行で要素を区切り、それを行列に格納して作業することができますか?それを行う必要があるのか​​、それとも簡単な解決法がありますか?

ありがとうございます!

答えて

0

awk + sortソリューション:

awk -v param="B" -F';' '$1==param{ print $2; exit }' <(sort -t';' -k1,1 -k3nr file.txt) 

出力:

green 

それともPursellの答え@Williamに加えて - だけカラー値を抽出するために:

awk -F';' '/^B/ && $3>m{ m=$3; c=$2 }END{ print c }' file.txt 
green 

経由のbashスクリプト

get_max_color.shスクリプト:

#!/bin/bash 

awk -F';' -v p="$1" '$0~"^"p && $3>m{ m=$3; c=$2 }END{ print c }' "$2" 

使用法:

bash get_max_color.sh B "file.txt" 
green 
+0

おかげで、それが動作しますが、私はそれが任意のパラメータのために仕事をしたいです。たとえば、 "C"で始めると、Cで始まる行を検索し、最大の数値を持つ行を選択し、その行の色を与えます(この場合は青です)。 – Aaron

+0

@Aaron 、私の第1のアプローチを見て、 '-v param =" B "' 'param'は任意の値に変更可能な変数です – RomanPerekhrest

+0

ええ、私はそれを変更できますが、他の何か、コードはその1つのパラメータのためだけに働くでしょう。私は "B"で始めると "緑"になり、 "C"で始めると "青"になり、 "A"で始めると "赤"になります – Aaron

0

は、あなただけのアプロをフィルタリングする必要があります見られる最大値を持つものを保存します。明白な解決策は以下のとおりです。

awk '/^B/ && $3 > m{s=$0} END { print s}' FS=\; input 

は、パラメータを使用するには、やる

awk "/^$1/"' && $3 > m{s=$0} END { print s}' FS=\; input 
+0

あなたの答えをありがとう、それは確かに "緑の"出力を与える"C"の場合、 "blue"を出力すると期待していますが、代わりに "green"を返します。 – Aaron

+0

"blue" :$ foo(){awk "/^$ 1 /" && $ 3} m {s = $ 0} END {印刷s} 'FS = \;入力; } $ foo C C;青; 3 ' –

0

awkソリューション、おそらくあまりエレガントで既に提案されたソリューションより遅い:

sort -r -t\; -k1,1 -k3 file | uniq -w1 | grep "B" | cut -f2 -d\; 
0

awk救助へ!

おそらくあなたが達成したいのか理解していないが、

awk -v key="$c" -F\; 'm[$1]<$3{m[$1]=$3; c[$1]=$2} END{print c[key]}' file 

はおそらくあなたができるキー

のファイルからいくつかの貧弱な使用パターン

$ for c in A B C; 
    do   
    echo $c "->" $(awk -v key="$c" -F\; 'm[$1]<$3 {m[$1]=$3; c[$1]=$2} 
              END  {print c[key]}' file); 
    done; 

A -> red 
B -> green 
C -> blue 

を最高のコード化された色を選択しますスクリプトの残りの部分をawkに実装し、このプロセスを1回実行します。

または、おそらくあなたは連想配列は、以下のように行うことができますしたい:

$ declare -A colors; 
    while IFS=\; read k c _ ; 
    do 
    colors[$k]=$c; 
    done < <(sort -t\; -k1,1 -k3nr file | uniq -w1) 

$ echo ${colors[A]} 
red 
関連する問題