다음을 포함하는 파일이 있습니다.
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] }
}