В Unix я пытаюсь найти команду, которая находила бы максимальное значение в Column3 и выводила бы соответствующие значения из Column2 и Column1 (но не из Column3) в новом файле.
Column1 Column2 Column3
A 1 25
B 2 6
C 3 2
D 4 16
E 5 10
Какая должна быть команда Unix? Мне следует использовать grep или awk или datamash?
решение1
Я бы использовал awk
. Предполагая, что данные отформатированы точно так же, как в вашем образце данных, следующее даст желаемый результат:
awk -v MAX=0 '{ if(NR>1 && $3>MAX){WANT1=$1; WANT2=$2; MAX=$3}} END{print WANT1, WANT2}' infile > outfile
решение2
Предполагая, что ваши данные отформатированы именно так, как вы указали (это особенно касается третьего столбца, все числа выровнены по левому краю) и что эти данные предоставлены файлом cat
, вы можете попробовать выполнить следующую команду:
*input generating command* | sort -nrk3 | awk '{print $1 " " $2}' > output_file
Если ваши данные предоставлены какой-то другой командой или источником, измените cat
на эту другую команду. Для получения дополнительной информации см.эта почтакоторый я по сути просто адаптировал под ваши нужды.
Редактировать:
Я немного изменил команду выше, так как нет необходимости указывать, что нужно sort
начинать с символа 1 столбца 3, так как sort всегда обрабатывает пробел как разделитель. Конечно, можно sort
также напрямую передать входной файл, как указал пользователь. Если заголовки также являются частью ваших данных, измените команду выше на:
*input generating command* | sort -nrk3 | awk '{if (NR>1) print $1 " " $2}' > output_file
решение3
awk '{if(NF>2 && $3>M){M=$3;print $1,$2} }' file1 | tail -1 > file2