Sortieren einer Datei basierend auf dem Unterschied zwischen zwei Spalten

Sortieren einer Datei basierend auf dem Unterschied zwischen zwei Spalten

Ich habe eine Liste namens Artists.dat. Ich möchte die Künstler nach ihrem Todesalter sortieren. Dann drucke ich für jeden Folgendes aus.

„Vorname“ „Nachname“ lebte „4–3 $“ Jahre.

z. B. Dorotha Tanning wurde 102 Jahre alt. (sortiert nach $4–$3)

Dorothea,  Tanning, 1910, 2012
Frida,     Kahlo, 1907, 1954
Gertrude,  Abercrombie, 1909, 1977
Leonora,   Carrington, 1917, 2011
Max,       Ernst, 1891, 1976
Remedios,  Varo, 1908, 1963
Rene,      Magritte, 1898, 1967
Salvador,  Dali, 1904, 1989
Yves,      Tanguy, 1900, 1955

Antwort1

Wenn Sie eine aktuelle Version von GNUawk

gawk -F', *' '
  {a[$1" "$2]=$4-$3}
  END {
    PROCINFO["sorted_in"]="@val_num_desc"
    for (i in a) print i, "lived for", a[i], "years"
  }
' Artists.dat

Antwort2

Obwohl die Lösung von Steeldriver viel eleganter ist, biete ich auch diese an.

awk -F"," '{print $1, $2, "lived for "$4-$3" years."}' Artists.dat|tr -s " "| sort -nrk5

Antwort3

Hier ist auch ein Versuch in Python --

/artists.py
Dorothea Tanning lived for 102 years
Leonora Carrington lived for 94 years
Salvador Dali lived for 85 years
Max Ernst lived for 85 years
Rene Magritte lived for 69 years
Gertrude Abercrombie lived for 68 years
Remedios Varo lived for 55 years
Yves Tanguy lived for 55 years
Frida Kahlo lived for 47 years


cat artists.py 
#!/usr/bin/python
d = {}
for line in open("artists.dat", "r"):
  parts = line.strip().split(",")
  name = parts[0].strip() + " " + parts[1].strip()
  age_died = int(parts[3]) - int(parts[2])    
  d[name] = age_died

for i in sorted(d, key=d.get, reverse=True):
  print("%s lived for %d years" %(i, d[i]))

verwandte Informationen