私はこれを試しました:
$ 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に感謝」
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であるため、k
は1
よりも前にソートされます( -n
)を使用して数値順をリクエストしました。
ソートは、行内のフィールドではなく、行ごとに機能します。
デフォルトでは、行の最初の文字に基づいてソートされ、そこから続行されます。ただし、最初以外の「キー」でソートすることもできます。これは、姓や行末の数値などで並べ替える場合に便利です。それが-t
フラグは、それのためです—それしない個々の行を分割し、それらの中でソートします。
それがあなたがやりたいことなら、 インラインフィールドのソート を見てください
カンマによるソートはある程度可能です:
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" ,
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
のような数値で失敗した場合にのみ機能します。