파이프를 통해 gawk로 정렬하는 방법은 무엇입니까?

파이프를 통해 gawk로 정렬하는 방법은 무엇입니까?

괴상한 사람을 분류하는 데 어려움을 겪고 있습니다. 나는 현재 다음을 가지고 있습니다:

gawk -f p3a01.awk unsortedNames.txt | sort | gawk -f p3a01.awk

그러나 이로 인해 잘못된 결과가 나타납니다. 다음과 같은 작업을 수행하면 gawk가 제대로 작동하는 것 같습니다.

gawk -f p3a01.awk unsortedNames.txt | sort > test1.out
gawk -f p3a01.awk test1.out

정렬을 gawk에 직접 파이프하는 올바른 방법이 있는지 잘 모르겠습니다. 나는 이상적으로 모든 것을 한 줄로하고 싶습니다.

스니펫 unsortedNames.txt:

Faye King
Lenny R Graph
I M Board
Grey White

p3a01.awk (성을 먼저 기재하고 나머지 이름을 기재하십시오):

BEGIN{}
{
      printf $NF " ";
      $NF="";
      print $0;
}
END{}

p3a02.awk(성을 기준으로 정렬한 후 원래 순서대로 파일을 인쇄합니다):

BEGIN{}
{
     for(i=2;i<=NF;i++){
         printf $i " ";
     }
     print $1;
}
END{}

최종 결과(성별로 정렬):

I M Board
Lenny R Graph
Faye King
Grey White

답변1

최적화단일 처리암소 비슷한 일종의 영양해결책:

awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_asc" }
     { a[$NF]=$0 }END{ for(i in a) print a[i] }' unsortedNames.txt


산출:

I M Board
Lenny R Graph
Faye King
Grey White

답변2

\r귀하의 코드는 광고된 대로 작동하는 것으로 보이므로 발생하는 오류는 입력 데이터의 보이지 않는 문자(줄 끝에 있습니까?)와 관련이 있을 수 있습니다.

나는 당신이 있다는 것을 알았습니다제거하다데이터 변환 시 마지막 필드입니다 sort. 이것은 필요하지 않습니다. 각 줄 앞에 마지막 필드를 추가하고 다음 줄에서 다시 제거하면 됩니다 sort.

$ awk '{ print $NF, $0 }' file | sort | cut -d ' ' -f 2-
I M Board
Lenny R Graph
Faye King
Grey White

cut명령은 두 번째 필드부터 공백으로 구분된 모든 필드를 출력합니다.

관련 정보