첫 번째 열에서 동일하지 않은 공백을 사용하여 정렬

첫 번째 열에서 동일하지 않은 공백을 사용하여 정렬

이 목록을 이름, 고온, 저온별로 정렬해야 합니다.

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을 구분 기호로 사용합니다(정렬에는 이상한 구문이 있습니다. 알아요.여기자세히 알아보고 세 번째 열에서 숫자로 정렬하세요.

관련 정보