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 cat
um 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 cat
para 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 sort
para 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