私のデータは次のようなものです:
key1 12
key1 14
key1 16
key2 13
key2 14
出力は次のようになります。
key1 16
key2 14
つまり、キーに関連付けられたより大きな値が必要です。
UNIXコマンドを使用してそれを行う方法は?
私のデータは次のようなものです:
key1 12
key1 14
key1 16
key2 13
key2 14
出力は次のようになります。
key1 16
key2 14
つまり、キーに関連付けられたより大きな値が必要です。
UNIXコマンドを使用してそれを行う方法は?
このワンライナーを試してください:
awk '{a[$1]=$2>a[$1]?$2:a[$1]}END{for(x in a)print x, a[x]}' file
編集
おっと、この回答を投稿した後、fedorqui が非常によく似た回答を投稿していることに気付きました (私より 3 倍早く) 別の回答を追加するだけです。ただし、上記の awk-oneliner が推奨されます。
sort -k1,1 -k2,2nr file|awk '$1!=t{t=$1;print}'
あなたのデータで:
kent$ echo "key1 12
key1 14
key1 16
key2 13
key2 14"|sort -k1,1 -k2,2nr|awk '$1!=t{t=$1;print}'
key1 16
key2 14
このようなものがそれを作ることができます:
$ awk '($2 > a[$1]) {a[$1]=$2} END{ for (i in a) print i, a[i]}' file
key1 16
key2 14
データは array に格納されるa[]
ため、インデックスは最初のフィールドで、値は値です。ファイルの読み取りがEND
完了すると、配列をループして結果を出力します。
bash を使用すると、次のスクリプトを使用して必要なものを取得できます。
declare -A result
( while read key val; do
if [ "${result[$key]}" == "" ]; then
result[$key]=$val;
elif [ ${result[$key]} -lt $val ]; then
result[$key]=$val;
fi;
done;
for key in ${!result[@]}; do
echo "$key ${result[$key]}";
done
)
値は整数でなければならないことに注意してください。そうしないと、2 番目の if 式でエラーが発生します。