我试过这个:
$ 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,-
“感谢斯蒂芬·查泽拉斯”
答案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','
没有任何效果,因为当您没有告诉 sort 对各个字段进行操作时,它会更改字段分隔符,因此k
之前已排序,1
因为其数值为 0 (并且您使用 请求数字排序-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
。