![다른 열을 조건으로 한 열의 값을 기준으로 데이터 정렬 [닫기]](https://linux55.com/image/127904/%EB%8B%A4%EB%A5%B8%20%EC%97%B4%EC%9D%84%20%EC%A1%B0%EA%B1%B4%EC%9C%BC%EB%A1%9C%20%ED%95%9C%20%EC%97%B4%EC%9D%98%20%EA%B0%92%EC%9D%84%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EC%A0%95%EB%A0%AC%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
나는 주어진 입력 데이터를 정렬하려고 노력해 왔습니다. 데이터가 정렬되는 조건입니다.
- 열 #1을 엄격하게 오름차순으로 정렬합니다.
이제 열 1의 열 2에 있는 데이터를 조건부로 오름차순으로 정렬합니다.
상태 설명:
- 열 3은 동일한 값으로 그룹화되어야 합니다(정렬 필요 없음). 그러나 열 2에서 가장 작은 값의 정렬 순서를 깨뜨려서는 안 됩니다.
예를 들어:
그룹-4(열#3)의 경우 col2의 최소값은 15882592입니다. << 그룹-5(열#3)의 경우 최소값은 15883889이므로 그룹 4는 그룹 5보다 높아야 합니다.
마찬가지로 그룹 5(열 3)의 경우 최소값은 열 2 15883889 << 그룹 1(열 3)의 경우 최소값은 15885010이므로 그룹 5는 그룹 1보다 높아야 합니다.
따라서 결국에는 먼저 col#1을 그룹화한 다음 col#3에서 열#2를 조건부로 그룹화해야 합니다. awk, sed, sort 또는 기타 유닉스 유틸리티를 사용하여 이를 수행할 수 있는 방법이 있습니까?
입력 데이터:
2 15881989 6
2 15882091 6
2 15882148 6
2 15882328 6
2 15882364 6
2 15882451 8
2 15882454 8
2 15882493 8
2 15882592 4
2 15882601 4
2 15882607 4
2 15883765 4
2 15883782 4
2 15883783 4
2 15883785 4
2 15883861 4
2 15883862 4
2 15883889 5
2 15883894 5
2 15883904 5
2 15884457 5
2 15884525 5
2 15884546 4
2 15884550 4
2 15884582 4
2 15884613 4
2 15884649 4
2 15884742 4
2 15884965 4
2 15885010 1
2 15885024 1
2 15885061 4
2 15896126 4
3 15896174 4
3 15896152 4
3 15896128 3
3 15896224 3
3 15896258 3
3 15896406 3
예상 출력:
2 15881989 6
2 15882091 6
2 15882148 6
2 15882328 6
2 15882364 6
2 15882451 8
2 15882454 8
2 15882493 8
2 15882592 4
2 15882601 4
2 15882607 4
2 15883765 4
2 15883782 4
2 15883783 4
2 15883785 4
2 15883861 4
2 15883862 4
2 15884546 4
2 15884550 4
2 15884582 4
2 15884613 4
2 15884649 4
2 15884742 4
2 15884965 4
2 15885061 4
2 15896126 4
2 15896128 4
2 15896152 4
2 15883889 5
2 15883894 5
2 15883904 5
2 15884457 5
2 15884525 5
2 15885010 1
2 15885024 1
3 15896128 3
3 15896224 3
3 15896258 3
3 15896406 3
3 15896152 4
3 15896174 4
감사해요,
답변1
데이터가 /tmp/test.dat에 있으면 원하는 출력이 제공됩니다.
sort -k 1n,2n /tmp/test.dat \
| awk '{
if (!($1 ":" $3 in A)) {A[$1 ":" $3] = $2}
print $1, $2, $3, A[$1 ":" $3]
}' \
| sort -k 1n -k 4n -k 2n | cut -d " " -f 1-3
1열과 3열의 각 값에 4번째 열을 추가하고 2열의 최소값을 추가하고, 4번째 열을 두 번째 정렬 값으로 사용한 후 다시 제거합니다.