처음 두 열의 최대값을 기준으로 정렬

처음 두 열의 최대값을 기준으로 정렬

다음을 포함하는 파일이 있습니다.

1 1 1 1 text1
7 9 4 2 text2
2 2 0.5 0.7 text3
5 4 1 2 text4

최대값을 기준으로 처음 두 열을 정렬(터미널로 출력)하고 싶습니다.

예상 출력:

1 1 1 1 text1
2 1 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

이것이 어떻게 달성될 수 있습니까? 감사해요!

답변1

입력 파일은 다음과 같습니다.

1 1 1 1 text1
7 9 4 2 text2
2 2 0.5 0.7 text3
5 4 1 2 text4

이 입력을 사용하면 간단한 sort작업이 수행됩니다.

$ sort << EOF
> 1 1 1 1 text1
> 7 9 4 2 text2
> 2 2 0.5 0.7 text3
> 5 4 1 2 text4
> EOF
1 1 1 1 text1
2 2 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

입력을 다음과 같이 수정하면...

$ cat test.txt
1 3 1 1 text1
7 9 4 2 text2
2 1 0.5 0.7 text3
5 4 1 2 text4

그러면 타이핑이 어려워집니다. 간단한 방법은 sort더 이상 작동하지 않습니다. 다른 방법을 테스트할 수 있습니다.

$ sort -k1,1n -k2,2n < test.txt
1 3 1 1 text1
2 1 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

이것아니요우리가 기대하는 것 - 출력의 처음 두 행이 반전됩니다. 행 1의 가장 높은 1/2 열 값은 "3"이고 행 2의 가장 높은 1/2 열 값은 "2"입니다.

다음은 적어도 수정된 입력 파일에서는 작동하는 것 같지만 보기에 좋지는 않습니다(내 awk-fu는 약합니다).

$ awk '{ sorton=$1; if ($2>$1) { sorton=$2 }; print $1, $2, $3, $4, $5, sorton }' < test.txt | sort -k 6 | cut -d " " -f 1-5
2 1 0.5 0.7 text3
1 3 1 1 text1
5 4 1 2 text4
7 9 4 2 text2

@Nominal-Animal 및 @JJoao가 제안한 개선 사항의 결과는 다음과 같습니다.

$ awk '{ k= $1>$2 ? $1: $2 ; print k, $0 }' test.txt | sort -g | cut -d ' ' -f 2-
2 1 0.5 0.7 text3
1 3 1 1 text1
5 4 1 2 text4
7 9 4 2 text2

awk( 솔루션을 개선하려면 이 게시물을 자유롭게 편집하세요 .)

답변2

처음 두 열의 숫자를 정렬하려면

sort -n -t " " -k1,1 -k2,2 /path/to/file

답변3

GNU를 사용하여 이 작업을 수행할 수 있습니다 sort.

sort -k1,1n -k2,2n yourfile
  • -k열을 지정하는 데 사용됩니다.

답변4

만약에awk로 GNU awk(gawk)가 있고 해당 asort()기능을 사용하여 awk 자체 내에서 모든 작업을 수행할 수 있습니다.

{
  max = $1 > $2 ? $1 : $2;
  if (max in lines)
    lines[max] = lines[max] ORS $0
  else
    lines[max] = $0
}

END {
  asort(lines, lines, "@ind_num_asc")
  for(i=1; i<=length(lines); i++) { print lines[i] }
}

관련 정보