Encontre o valor máximo da Coluna3 e imprima apenas os valores da Coluna1 e 2

Encontre o valor máximo da Coluna3 e imprima apenas os valores da Coluna1 e 2

No Unix, estou tentando encontrar um comando que encontre o valor máximo na Coluna3 e imprima os valores correspondentes da Coluna2 e Coluna1 (mas não da Coluna3) em um novo arquivo.

 Column1     Column2     Column3
   A          1          25
   B          2          6
   C          3          2
   D          4          16
   E          5          10

Qual deve ser o comando Unix? Devo usar grep ou awk ou datamash?

Responder1

Eu usaria awk. Supondo que os dados estejam formatados exatamente de acordo com os dados de amostra, o seguinte produzirá a saída desejada:

awk -v MAX=0 '{ if(NR>1 && $3>MAX){WANT1=$1; WANT2=$2; MAX=$3}} END{print WANT1, WANT2}' infile > outfile

Responder2

Supondo que seus dados estejam formatados exatamente como indicado por você (isso vale especialmente para a terceira coluna, números todos alinhados à esquerda) e que esses dados sejam fornecidos por catum arquivo, você pode tentar este comando:

*input generating command* | sort -nrk3 | awk '{print $1 " " $2}' > output_file

Caso seus dados sejam fornecidos por algum outro comando ou fonte, mude catpara esse outro comando. Para mais informações, vejaesta postagemque basicamente adaptei às suas necessidades.

Editar:

Alterei um pouco o comando acima, pois não há necessidade de informar sortpara iniciar no caractere 1 da coluna 3, pois a classificação sempre trata um espaço em branco como um separador. É claro que também é possível fornecer o arquivo de entrada diretamente sort, como apontou um usuário. Se também os cabeçalhos fizerem parte dos seus dados, altere o comando acima para:

*input generating command* | sort -nrk3 | awk '{if (NR>1) print $1 " " $2}' > output_file

Responder3

awk '{if(NF>2 && $3>M){M=$3;print $1,$2} }' file1 | tail -1 > file2

informação relacionada