권장하지는 않지만 (외부 sort
명령을 통해 결과를 파이핑하는 것이 상대적으로 간단 함 ) gawk를 사용하여 배열 값 및 인덱스 정렬에 설명 된 것처럼 최신 GNU awk (최소 4.0 IIRC) 로이 작업을 수행 할 수 있습니다
인덱스가 인 연관 배열에 데이터가 있다고 가정하고 구현하는 방법은 다음과 같습니다 Firstname Lastname
. 먼저 인덱스를 분할하고 Lastname
( Firstname
예 : 타이 브레이커로) 먼저 비교하는 사용자 정의 비교 함수를 정의해야합니다.
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
이제 PROCINFO["sorted_in"]
@zwets의 의견에 언급 된 배열 정렬 방법을 사용할 수 있습니다
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
함께 모으기
#!/usr/bin/gawk -f
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
{
a[$1" "$2] = $3;
}
END {
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
}
테스트 :
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
awk의 더 작거나 오래된 버전의 경우 가장 좋은 방법은 인덱싱 된 데이터를 Lastname Firstname
대신 저장 하고 기존의 정렬 방식으로 정렬 asorti
한 다음 배열을 통과하여 인덱스 필드를 분할하고 스왑하여 인쇄하는 것입니다.
awk '
{a[$2" "$1]=$3}
END {
n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile
x
PROCINFO["sorted_in"]