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

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

私はこれを試しました:

$ 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その行内の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','個々のフィールドに対してソート操作を指示しないと、フィールド区切り文字が変更され、数値がゼロ(および数値ソート要求を使用したため)以前にソートされたため、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

1行に戻るには:

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などが混在している場合は失敗します。

関連情報