0

私のデータは次のようなものです:

key1 12
key1 14
key1 16
key2 13
key2 14

出力は次のようになります。

key1 16
key2 14

つまり、キーに関連付けられたより大きな値が必要です。

UNIXコマンドを使用してそれを行う方法は?

4

4 に答える 4

3

このワンライナーを試してください:

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
于 2013-09-16T11:48:26.927 に答える
1

このようなものがそれを作ることができます:

$ awk '($2 > a[$1]) {a[$1]=$2} END{ for (i in a) print i, a[i]}' file
key1 16
key2 14

データは array に格納されるa[]ため、インデックスは最初のフィールドで、値は値です。ファイルの読み取りがEND完了すると、配列をループして結果を出力します。

于 2013-09-16T11:44:58.133 に答える
0

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 式でエラーが発生します。

于 2013-09-16T12:13:36.780 に答える