숫자와 null 값이 포함된 목록을 오름차순으로 정렬하는 방법은 무엇입니까?

숫자와 null 값이 포함된 목록을 오름차순으로 정렬하는 방법은 무엇입니까?

숫자와 null 값 목록이 있습니다. null 값이 목록 sort끝에 도달하도록 in을 사용하여 정렬하는 방법GNU 핵심 도구?

입력 샘플 열(input.data)

0.9000
23

1
2
5

-0.9000
-23

-1
-2
-5

을 사용하려고 하면 sort -g input.data출력은 다음과 같습니다.

<NULL>
<NULL>
<NULL>
-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23

여기서는 null 값이 맨 위에 배치됩니다. 목록 끝에 null 값을 넣을 수 있나요? 다음을 기대하십시오:

-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23
<NULL>
<NULL>
<NULL>

편집: 맨 아래에 null 값을 넣는 목적은 데이터 집합을 정렬하고 맨 아래에 null 값이 있는 행을 넣는 것입니다.

이건 내가 예상했던 거고,

| Sample Input                  || Current output                || Expected output            |
|-------------------------------||-------------------------------||----------------------------|
| 2     0.9000      value 1     || 11               value 10     || 10  -23         value 9    |
| 3     23          value 2     || 4                value 3      || 14  -5          value 13   |
| 4                 value 3     || 8                value 7      || 13  -2          value 12   |
| 5     1           value 4     || 10   -23         value 9      || 12  -1          value 11   |
| 6     2           value 5     || 14   -5          value 13     || 9   -0.9000     value 8    |
| 7     5           value 6     || 13   -2          value 12     || 2   0.9000      value 1    |
| 8                 value 7     || 12   -1          value 11     || 5   1           value 4    |
| 9     -0.9000     value 8     || 9    -0.9000     value 8      || 6   2           value 5    |
| 10    -23         value 9     || 2    0.9000      value 1      || 7   5           value 6    |
| 11                value 10    || 5    1           value 4      || 3   23          value 2    |
| 12    -1          value 11    || 6    2           value 5      || 11              value 10   |
| 13    -2          value 12    || 7    5           value 6      || 4               value 3    |
| 14    -5          value 13    || 3    23          value 2      || 8               value 7    |

답변1

적절한 후처리기를 통해 결과를 전송할 수 있습니다. 이것은 내가 sed를 사용하여 작성한 내용입니다.

#!/bin/sed -f

# Move any null into hold space
/^$/{
H
d
}

# Insert nulls after last line
$G
# Delete an extra newline this introduces
$s/\n//

sort빈 줄 대신 쓰는 경우 <NULL>모드를 /^$/로 변경해야 합니다 /^<NULL>$/.

데모

sort -g <<EOF | ./475768.sed 
0.9000
23
      
1
2     
5
  
-0.9000
-23
 
-1
-2
-5
EOF
-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23


 

답변2

sort -g input.data | grep [0-9] && grep -v [0-9] input.data

  1. 유형
  2. 숫자만 필터링
  3. grep 명령을 반대로 실행하여 나머지 NULL을 추가합니다.

답변3

다음과 같이 플래그 Vrin을 사용할 수 있습니다.sort

sort -Vr file
-23
-5
-2
-1
-0.9000
23
5
2
1
0.9000




 .

~에 따르면다소:

 -r, --reverse               reverse the result of comparisons
 -V, --version-sort          natural sort of (version) numbers within text

답변4

다음 예시 입력을 사용하세요.

$ cat infile
 2     0.9000      value 1
 3     23          value 2
 4                 value 3
 5     1           value 4
 6     2           value 5
 7     5           value 6
 8                 value 7
 9     -0.9000     value 8
 10    -23         value 9
 11                value 10
 12    -1          value 11
 13    -2          value 12
 14    -5          value 13

다음 명령을 사용하십시오.

$ sort -k 3n,3n -k 2g,2g infile

결과는 다음과 같습니다.

 10    -23         value 9
 14    -5          value 13
 13    -2          value 12
 12    -1          value 11
 9     -0.9000     value 8
 2     0.9000      value 1
 5     1           value 4
 6     2           value 5
 7     5           value 6
 3     23          value 2
 4                 value 3
 8                 value 7
 11                value 10

줄이 줄 앞 이 아니라 끝에 있기 Expected output때문에 답변과 다릅니다 . 계속 진행 하거나 정렬 해야 하는 이유가 있거나 문제가 예시 데이터에서 제시하는 것보다 더 심각한 경우 질문을 업데이트하세요.11 value 104 value 311 < 4 < 810 < 3 < 7

관련 정보