私はこれを試しました:
$ 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
などが混在している場合は失敗します。