다른 열을 조건으로 한 열의 값을 기준으로 데이터 정렬 [닫기]

다른 열을 조건으로 한 열의 값을 기준으로 데이터 정렬 [닫기]

나는 주어진 입력 데이터를 정렬하려고 노력해 왔습니다. 데이터가 정렬되는 조건입니다.

  • 열 #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번째 열을 두 번째 정렬 값으로 사용한 후 다시 제거합니다.

관련 정보