이 목록을 이름, 고온, 저온별로 정렬해야 합니다.
Kuala Lumpur 78 56
Seoul 85 66
Karachi 95 75
Tokyo 85 60
Lahore 85 75
Manila 90 85
공백은 열 구분 기호이므로
sort -k 1
다음과 같이 줄 수 있다고 생각했습니다.
Karachi 95 75
Kuala Lumpur 78 56
Lahore 85 75
Manila 90 85
Seoul 85 66
Tokyo 85 60
하지만 '쿠알라룸푸르'는 공간 문제로 문제를 일으켰다.
그래서 "Lumpur"를 열로 처리하고 첫 번째 숫자 집합을 정렬해 보았습니다.
sort -k 3n
하지만 나는 그것을 이해합니다:
Tokyo 85 60
Seoul 85 66
Karachi 95 75
Lahore 85 75
Kuala Lumpur 78 56 <---Why is this out of order?
Manila 90 85
이 공간으로 무엇을 할까요?
답변1
다른 사람들의 의견처럼 쉼표로 구분된 값(CSV)이면 데이터 작업이 더 쉽습니다.
데이터를 CSV로 변환하는 솔루션은 다음과 같습니다.
$ cat file | sed 's/ \([0-9]\)/,\1/g'
Kuala Lumpur,78,56
Seoul,85,66
Karachi,95,75
Tokyo,85,60
Lahore,85,75
Manila,90,85
숫자 앞의 공백은 쉼표로 대체됩니다. \1
참조 그룹([0-9]), 즉 공백 뒤의 숫자입니다. 여기에서 sort
매개변수를 사용하여 -t
필드 구분자를 지정할 수 있습니다.
$ cat file | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2
Kuala Lumpur,78,56
Tokyo,85,60
Seoul,85,66
Lahore,85,75
Manila,90,85
Karachi,95,75
다시 공백으로 변환하거나 테이블을 만들려면 다음 두 가지 예를 참조하세요.
$ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | tr , ' '
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 85 66
Lahore 85 75
Manila 90 85
Karachi 95 75
$ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | column -s, -t
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 85 66
Lahore 85 75
Manila 90 85
Karachi 95 75
답변2
awk '{print $NF,$0}' file.txt | sort -nr -k1 | cut -d' ' -f2-
$NF
:필드 개수,$0
:전체 행sort -nr
: 숫자 역순(내림차순)sort -k1
: 첫 번째 열을 기준으로 정렬(공백 및 탭 순서로 구분)cut -d
: 구분 기호(기본값은 탭)cut -f2-
:필드 2부터 끝까지(구분자를 접거나 제거하지 않음)
ruby -e 'puts readlines.sort_by{|l|l.split[-1].to_i}.reverse' file.txt
readlines
=ARGF.readlines
split
기본적으로 공백으로 분할
답변3
파일을 탭으로 구분된 열로 변경할 수 있다면 생활이 더 쉬워질 것입니다. 파일을 변경할 수 없는 경우 다음 Perl 문이 대신 수행합니다.
perl -ne 's/\s+/\t/g; s/([a-z])\s([a-z])/$1 $2/ig; s/\t$/\n/; print;' file |
sort -t$'\t' -nk3
Kuala Lumpur 78 56
Tokyo 85 60
Seoul 85 66
Karachi 95 75
Lahore 85 75
Manila 90 85
설명하다:
s/\s+/\t/g
: 공백을 모두 TAB으로 변경하세요.s/([a-z])\s([a-z])/$1 $2/ig
: 두 글자(숫자 없음) 사이의 탭 문자를 다시 공백 하나로 변경합니다.s/\t$/\n/
: 첫 번째 대체에서는 각 줄 끝에 탭 문자를 추가하고 다시 개행 문자(\n
)로 변경합니다.sort -t$'\t' -nk3
: TAB을 구분 기호로 사용합니다(정렬에는 이상한 구문이 있습니다. 알아요.여기자세히 알아보고 세 번째 열에서 숫자로 정렬하세요.