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

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

我试过这个:

$ 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

相关内容