필드 내의 문자 필드 위치를 기준으로 숫자로 정렬

필드 내의 문자 필드 위치를 기준으로 숫자로 정렬

전달하는 DNS 영역 파일의 발췌문이 있는데 이를 IP 주소 기준으로 오름차순으로 정렬하고 싶습니다. 이는 IP 주소 정렬에 관한 것이 아니므로( sort -k5V수정될 예정임) 중복으로 표시하기 전에 잠시 읽어보시기 바랍니다 .

다음은 데이터의 예입니다.

esx01.example.com.      3600    IN      A       10.1.1.212
ilo01.example.com.      3600    IN      A       10.1.1.211
nas01.example.com.      3600    IN      A       10.1.1.101
pc001.example.com.      1200    IN      A       10.1.1.42
pc002.example.com.      1200    IN      A       10.1.1.52
pc003.example.com.      1200    IN      A       10.1.1.29

이 특별한 경우에는 마지막 옥텟으로만 정렬할 수 있으므로 이 옥텟은 이어야 합니다 sort.

매뉴얼 페이지에서는 -k필드뿐만 아니라 필드 내의 오프셋과 n숫자 수정자를 사용할 수 있음을 확인합니다.

KEYDEFF[.C][OPTS][,F[.C][OPTS]]는 시작 및 끝 위치 입니다 . 여기서 는 F필드 번호와 C필드의 문자 위치 모두 원점 1이고 정지 위치는 기본적으로 줄 끝입니다. -t와 -b가 모두 유효하지 않은 경우 필드의 문자는 이전 공백의 시작 부분부터 계산됩니다. 이 키에 대한 전역 정렬 옵션을 재정의하는 OPTS하나 이상의 단일 문자 정렬 옵션 [ ]입니다 .bdfgiMhnRrV

마지막 옥텟은 편리하게 다섯 번째 필드의 문자 오프셋 8에서 시작하므로 이 명령이면 충분하다고 이해합니다.

sort -k5.8n /tmp/axfr.10.1.1

그러나 이것은 내 데이터를 전혀 정렬하지 않습니다. 경험상 실제 위치에서 시작해야 한다는 것을 알았습니다.15예상대로 데이터를 오름차순으로 정렬합니다.

sort -k5.15n /tmp/axfr.10.1.1

pc003.example.com.      1200    IN      A       10.1.1.29
pc001.example.com.      1200    IN      A       10.1.1.42
pc002.example.com.      1200    IN      A       10.1.1.52
nas01.example.com.      3600    IN      A       10.1.1.101
ilo01.example.com.      3600    IN      A       10.1.1.211
esx01.example.com.      3600    IN      A       10.1.1.212

왜?

답변1

sort --debug몇 가지 단서를 얻으려면 이 옵션을 사용하세요 .

$ echo 'esx01.example.com.      3600    IN      A       10.1.1.212' | 
   sort --debug -k5.8n
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                ____

정렬 필드에 밑줄을 긋습니다. 이것은 당신이 기대하는 것이 아닙니다. -b정렬에서는 이전 필드의 끝부터 시작하여 열을 계산하기 때문에 필요합니다 (맨 페이지:-t와 -b가 모두 유효하지 않은 경우 필드의 문자는 이전 공백의 시작 부분부터 계산됩니다.):

$ ... | sort --debug -b -n -k5.8 
sort: using simple byte comparison
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                       ___

분리 해야 합니다 -n:

$ ... | sort --debug -b -k5.8n
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
sort: option '-b' is ignored
esx01.example.com.      3600    IN      A       10.1.1.212
                                                ____

또는 b주어진 n:

$ ... | sort --debug  -k5.8nb
sort: using simple byte comparison
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                       ___

답변2

정렬(또는 기타 항목)에 대한 현장 사양이 활력을 잃고 구성, 해독 및 디버깅이 어려워지면 데이터 전처리가 더 효율적이고 명확해질 수 있습니다.

awk -F. '{print $NF"\t"$0}' | sort -snk1,1 | cut -f2-

관련 정보