Bash 정렬의 또 다른 문제

Bash 정렬의 또 다른 문제

이 목록을 정렬할 때 "쿠알라룸푸르"의 공백을 어떻게 무시할 수 있나요? 열을 선택하고 탭에서 정렬하여 올바른 결과를 얻었지만 열의 공백을 처리하는 방법을 알고 싶습니다. 특히 목록 형식을 다시 지정하는 것이 좋은 습관처럼 보이지 않기 때문입니다. 목록이 더 큰 시간일 때.

미리 감사드립니다

  Kuala Lumpur        78          56

  Seoul               86          66

  Karachi             95          75

  Tokyo               85          60

  Lahore              85          75

  Manila              90          85

도시별:

Karachi             95          75

Kuala Lumpur        78          56

Lahore              85          75

Manila              90          85

Seoul               86          66

Tokyo               85          60

또한 고온(고-저, 두 번째 열) 및 저온(저-고, 세 번째 열)으로 정렬했습니다.

고온을 누르십시오:

 Karachi             95          75

 Manila              90          85

 Seoul               86          66

 Lahore              85          75

 Tokyo               85          60

 Kuala Lumpur        78          56

저온을 누르십시오:

  Kuala Lumpur        78          56

  Tokyo               85          60

  Seoul                86          66

  Karachi             95          75

  Lahore              85          75

  Manila              90          85

답변1

1) 명령을 통해 공백을 탭으로 변환합니다 unexpand(공백 8개마다 탭이 있다고 생각하세요).

TAB2) 다음과 같이 구분 정렬을 사용합니다.

TAB=`echo -e "\t"`
sort -t"$TAB" YOUR_FILE

답변2

참고:- 귀하의 질문이 두 번 변경되었지만 답변을 계속해서 변경할 수는 없지만 답변은 동일하게 유지된다는 점을 알려드리고 싶습니다. -k22가 열인 곳을 사용하여 열 번호를 정렬하면 다음을 얻을 수 있습니다. 정답이에요.

방금 sort + sed를 사용했습니다.

도시별

sort -k1 input_data | sed '/^$/d; s/$/\n/'

고온을 누르십시오:

sort -k2 -nr data | sed '/^$/d; s/$/\n/'

저온을 누르십시오:

sort -k4 -nr data | sed '/^$/d; s/$/\n/'

설명하다:

정렬된 데이터는 sed로 전송됩니다.

그런 다음 sed를 사용하여 첫 번째 빈 줄을 제거한 /^$/d 다음 각 줄 뒤에 새 줄을 추가합니다.

답변3

두 가지 옵션이 있습니다.

  1. 공백이 제거된 정렬 가능한 새 이름 열을 만들고 이 임시/새 열을 기준으로 정렬한 다음 결국 이 "임시" 열의 출력을 억제합니다. 또는

  2. 필드 구분 기호가 모든 필드에서 유효한 문자가 아닌지 확인하세요. 공백은 도시 이름에 유효한 문자이므로 다른 문자를 필드 구분 기호로 사용해야 합니다.

옵션 1을 사용하면 이름을 모두 소문자, 숫자 제거, 문자를 다른 문자로 변환 등의 다른 이름으로 바꿀 수 있으므로 더 많은 제어가 가능하지만 구현하기가 더 복잡합니다.

옵션 2는 다음과 같이 수행할 수 있습니다.

#!/bin/bash
awk '{TLOW=$(NF-1); 
      THIGH=$NF; 
      $NF=""; 
      $(NF-1)="";
      gsub(" +$","");
      CITYNM=$0; 
      printf ("%s:%s:%s\n", CITYNM, TLOW, THIGH)}' | sort -t: 

이제 문제는 "Cape Town" 및 "Capelle"과 같은 이름을 정렬하는 방법입니다. 유닉스 정렬 명령은 Capelle을 Cape Town 앞에 배치하지만 이는때때로당신이 원하는 것이 아닙니다. 이때 옵션 1이 작동하게 됩니다.

관련 정보