각 행의 쉼표로 구분된 필드를 숫자 값으로 정렬

각 행의 쉼표로 구분된 필드를 숫자 값으로 정렬

나는 이것을 시도했습니다 :

$ echo "2,3435,1" | sort -n
2,3435,1

$ sort -t',' -n test_sort.txt
kill,gill,burger
110,20,30,13

$ cat test_sort.txt
110,20,30,13
kill,gill,burger

sort명령이 작동하지 않는 이유는 무엇입니까?

내가 원하는 명령은 sort다음과 같이 작동해야 합니다.

$sort -t',' -n test_sort.txt  
110,13,20,30,burger,gill,kill

답: tr , '\n' < a | sort -n 붙여넣기, -

“스티븐 차제라스에게 감사드립니다”

답변1

sort전체 라인을 달리십시오. 기본적으로 행의 전체 내용을 정렬하지만 -k해당 행 내의 하나 이상의 필드를 정렬하는 데 사용할 수도 있습니다. -t필드 사이의 구분 기호를 변경하는 데 사용할 수 있습니다. 사용 -t하지 않고 사용하는 것이 -k의미가 있는 상황은 생각할 수 없습니다 .

두 번째 명령은 다음과 같습니다.

printf "%s\n%s\n" "110,20,30,13" "kill,gill,burger" | sort -t',' -n

생산하다:

kill,gill,burger
110,20,30,13

이것이 바로 제가 기대했던 것입니다. -t','개별 필드에 대해 정렬 작업을 지시하지 않으면 필드 구분 기호가 변경되어 숫자 값이 0(그리고 숫자 정렬 요청을 사용했기 때문에 ) k이전에 정렬되었으므로 아무런 효과가 없습니다.1-n

답변2

쉼표로 정렬이 가능합니다.

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort

산출

2
4a
a
a
a
b
b
d
dx
sa
z
z

한 줄로 돌아가려면 다음을 수행하십시오.

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort | tr "\n" ,

답변3

정렬은 행 내의 필드가 아닌 각 행을 기준으로 이루어집니다.

기본적으로 줄의 첫 번째 문자를 기준으로 정렬하고 거기부터 계속됩니다. 그러나 시작 부분이 아닌 "키"를 기준으로 정렬할 수도 있습니다. 이는 행 끝의 성이나 숫자 값 등을 기준으로 정렬하려는 경우에 유용합니다. 그것이 -t바로 깃발의 목적입니다.에 익숙해개별 행을 분류하고 그 안에서 정렬합니다.

이것이 당신이 하고 싶은 일이라면, 보세요.인라인 정렬 필드

답변4

다음 명령을 사용하면 더 쉬울 것입니다 perl.

$ perl -F',' -anle '
    BEGIN { $" = "," }
    print "@{[sort {$a <=> $b} @F]}"
' file 
13,20,30,110
kill,gill,burger

숫자가 포함된 행만 정렬됩니다. 다음과 같은 문자열이 포함된 행을 정렬하려면 sort -n다음을 시도해 보세요.

$ $ perl -MPOSIX=isdigit -F',' -anle '
BEGIN { $" = "," }
print "@{[ sort { isdigit($a)
              ? ($a <=> $b)
              : ($a cmp $b)
              } @F
        ]}"
' file
13,20,30,110
burger,gill,kill

이 방법은 like에 문자열만 포함된 경우에만 작동하고 like에 문자열, 숫자 kill,gill,20등 이 혼합되어 있으면 실패합니다.

관련 정보