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개의 필드가 포함되어 있다고 가정합니다.