按数值对每行的逗号分隔字段进行排序

sij*_*sij 8 text-processing sort

我试过这个:

$ 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
Run Code Online (Sandbox Code Playgroud)

为什么我的sort命令不起作用?

我想要的sort命令应该像这样工作:

$sort -t',' -n test_sort.txt  
110,13,20,30,burger,gill,kill
Run Code Online (Sandbox Code Playgroud)

答案: tr , '\n' < a | 排序 -n | 粘贴 -sd, -

“感谢 Stéphane Chazelas”

god*_*eek 11

sort在整条线上运行。默认情况下,它对该行的全部内容-k进行排序,但可用于对这些行中的一个或多个字段进行排序。 -t可用于更改字段之间的分隔符。我想不出使用-t而不使用的情况有-k任何意义。

您的第二个命令,相当于:

printf "%s\n%s\n" "110,20,30,13" "kill,gill,burger" | sort -t',' -n
Run Code Online (Sandbox Code Playgroud)

产生:

kill,gill,burger
110,20,30,13
Run Code Online (Sandbox Code Playgroud)

这是我所期望的。 -t','没有任何影响,因为当您没有告诉 sort 对单个字段进行操作时,它会更改字段分隔符,因此k之前已排序,1因为其数值为 0(并且您使用 请求数字排序-n)。


小智 7

按逗号排序是有可能的:

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort
Run Code Online (Sandbox Code Playgroud)

输出

2
4a
a
a
a
b
b
d
dx
sa
z
z
Run Code Online (Sandbox Code Playgroud)

如果你想让它回到一行:

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort | tr "\n" ,
Run Code Online (Sandbox Code Playgroud)


mat*_*tdm 6

排序基于每行,而不是一行内的字段。

默认情况下,它根据行上的第一个字符进行排序,然后从那里继续。但是您也可以对除开头以外的“键”进行排序。当您想按姓氏或行尾的数值等进行排序时,这很有用。这就是-t标志的用途——它不会分解单独的行并在其中进行排序。

如果这就是您想要做的,请参阅内联对字段进行排序