cat marks.txt
retorna
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
awk -F" " '{ print $4"\t" $0 }' marks.txt | sort | cut -f 2-
classificou com sucesso o texto com base na quarta coluna.
context: https://stackoverflow.com/questions/17048188/how-to-use-awk-sort-by-column-3
mas para emular a resposta mais votada: sort -t" " -nk4 marks.txt
mas apenas retorne:
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
por que a cláusula de classificação não está funcionando?
usando
sort -t' '
(caractere de espaço como separador de campo aqui) considerará cada espaço como um separador de campo nem todos os consecutivos como um único separador, razão pela qual não está fornecendo o que você espera e é por isso que a primeira solução de comando é fornecida que separa o último campo com separador de guias dedicado, em seguida, classifique com base nesse campo e remova-o da saída.Observe que o uso de
-F" "
here usado no comando awk não tem efeito colateral na saída ou processamento do comando e isso também pode ser removido; além disso, sabendo que em awk, using-F" "
consideraria quaisquer espaços consecutivos como um único separador, enquanto na classificação-t" "
consideraria cada espaço como um separador separado (o equivalente no awk é-F"[ ]"
, ou seja, definindo o separador de campo como um regex).No final, é melhor você fazer o seguinte:
A diferença entre usar
-F
com um espaço emawk
e usar-t
com um espaço emsort
é a seguinte:awk -F ' '
é o mesmo que justoawk
. Um único espaço é o valor padrão deFS
(o separador de campo interno) e fará com que osawk
espaços em branco (tabulações e/ou espaços) sejam cortados dos dados, bem como tratar substrings separadas por execuções de espaços em branco consecutivos como campos.sort -t ' '
tratará cada espaço como um delimitador. Usarsort
sem-t
fará com que o utilitário divida cada linha em campos da mesma maneiraawk
, em execuções de espaços em branco consecutivos (tabulações e/ou espaços).Seu primeiro comando,
(uma transformada Schwartziana ) é, portanto, o mesmo que
ou, usando
OFS
para definir o separador de campo de saída para uma guia,(Observe também a adição de
-n
acimasort
; desejamos classificar numericamente.)Acessar explicitamente o último campo de cada linha permite que os outros campos sejam de número variável (se contiverem espaços, por exemplo):
Seu
sort
comando pode ser reescrito para classificar corretamente numericamente pela 4ª coluna delimitada em branco da seguinte forma:Obviamente, isso pressupõe que cada linha dos dados sempre conterá exatamente quatro campos delimitados em branco.