두 열의 차이를 기준으로 파일 정렬

두 열의 차이를 기준으로 파일 정렬

Artists.dat라는 목록이 있습니다. 아티스트가 사망했을 때의 나이를 기준으로 아티스트를 정렬하고 싶습니다. 그런 다음 각각에 대해 다음을 인쇄하십시오.

"이름" "성"은 "$4-$3"년 동안 살았습니다.

예를 들어 도로사 태닝(Dorotha Tanning)은 102년을 살았습니다. ($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

답변1

최신 버전의 GNU가 있는 경우awk

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

답변2

steeldriver의 솔루션이 훨씬 더 우아하지만 이 솔루션도 제공합니다.

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

답변3

파이썬에서도 노력을 기울이고 있습니다.

/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]))

관련 정보