예상대로 작동하지 않는 열 기준 정렬

예상대로 작동하지 않는 열 기준 정렬

cat marks.txt반품

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

awk -F" " '{ print $4"\t" $0 }' marks.txt | sort | cut -f 2-네 번째 열을 기준으로 텍스트를 성공적으로 정렬했습니다.

문맥:https://stackoverflow.com/questions/17048188/how-to-use-awk-sort-by-column-3
그러나 가장 많이 투표된 답변을 모방하려면 sort -t" " -nk4 marks.txt 다음만 반환합니다.

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

주문 절이 작동하지 않는 이유는 무엇입니까?

답변1

(여기서 필드 구분 기호로 공백 문자) 를 사용하면 sort -t' '모든 연속 공백을 단일 구분 기호로 처리하는 대신 각 공백을 필드 구분 기호로 처리하므로 예상한 결과를 제공하지 못합니다. 그렇기 때문에 마지막 공백을 구분하기 위해 첫 번째 쉼표 솔루션이 제공되었습니다. 필드를 전용 탭 구분 기호로 지정하고 해당 필드를 기준으로 정렬한 다음 출력에서 ​​제거합니다.

awk commnad에서 여기를 사용하면 -F" "명령 출력이나 처리에 부작용이 없으며 제거할 수 있습니다. 또한 awk에서 사용을 사용하면 -F" "연속 공백을 단일 구분 기호로 처리하는 반면 정렬에서는 -t" "모든 단일 공백을 별도 구분 기호로 처리합니다( awk에서 이에 상응하는 것은 -F"[ ]"필드 구분 기호를 정규식으로 정의하는 것입니다.

결국 다음과 같이 하는 것이 좋습니다.

awk '{ print $NF"\t"$0 }' marks.txt |sort |cut -f2-

답변2

-F공백과 함께 in을 사용하는 것과 공백과 함께 awk사용하는 것의 -t차이점 sort은 다음과 같습니다.

  • awk -F ' '이전과 같습니다 awk. FS(내부 필드 구분 기호)의 기본값은 공백 하나입니다 . 이로 인해 awk데이터의 측면 공백(탭 및/또는 공백)이 잘리고 연속 공백으로 구분된 하위 문자열이 필드로 처리됩니다.

  • sort -t ' '각 공백을 구분 기호로 처리합니다. sort없이 사용하면 -t유틸리티는 awk연속 공백(탭 및/또는 공백)과 동일한 방식으로 각 줄을 필드로 나눕니다.

첫 번째 명령,

awk -F" " '{ print $4"\t" $0 }' marks.txt | sort -n | cut -f 2-

(ㅏ슈워츠 변환) 따라서

awk '{ print $4 "\t" $0 }' marks.txt | sort -n | cut -f 2-

또는 OFS출력 필드 구분 기호를 탭으로 설정을 사용하세요.

awk -v OFS='\t' '{ print $4, $0 }' marks.txt | sort -n | cut -f 2-

-n(위의 추가 사항도 참고하세요 sort. 숫자로 정렬하려고 합니다.)

명시적 액세스마지막행당 필드에서는 다양한 수의 다른 필드를 허용합니다(예: 공백이 포함된 경우).

awk -v OFS='\t' '{ print $NF, $0 }' marks.txt | sort -n | cut -f 2-

sort다음과 같이 공백으로 구분된 네 번째 열을 기준으로 숫자를 올바르게 정렬하도록 명령을 다시 작성할 수 있습니다 .

sort -k 4n marks.txt

분명히 이는 각 데이터 행에 항상 공백으로 구분된 4개의 필드가 포함되어 있다고 가정합니다.

관련 정보