web-dev-qa-db-ja.com

各行のカンマ区切りフィールドを数値でソートします

私はこれを試しました:

$ 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 |ソート-n |貼り付け-sd、-

「StéphaneChazelasに感謝」

7
sij

sortは行全体で機能します。デフォルトでは、その行の内容全体でソートされますが、-kを使用して、それらの行内の1つ以上のフィールドでソートできます。 -tを使用して、フィールド間の区切り文字を変更できます。 -tを使用せずに-kを使用しても意味がない場合は考えられません。

次のコマンドと同等の2番目のコマンド:

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

生成する:

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

これは私が期待することです。 -t','は、個々のフィールドを操作するようにsortに指示していない場合にフィールド区切り文字を変更するため、効果がありません。そのため、数値が0であるため、k1よりも前にソートされます( -n)を使用して数値順をリクエストしました。

10
godlygeek

ソートは、行内のフィールドではなく、行ごとに機能します。

デフォルトでは、行の最初の文字に基づいてソートされ、そこから続行されます。ただし、最初以外の「キー」でソートすることもできます。これは、姓や行末の数値などで並べ替える場合に便利です。それが-tフラグは、それのためです—それしない個々の行を分割し、それらの中でソートします。

それがあなたがやりたいことなら、 インラインフィールドのソート を見てください

6
mattdm

カンマによるソートはある程度可能です:

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" ,
2
ubershmekel

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 contains混合文字列、kill,gill,20のような数値で失敗した場合にのみ機能します。

1
cuonglm