linux 如何按特定列对CSV文件进行排序?

nbysray5  于 2023-01-08  发布在  Linux
关注(0)|答案(3)|浏览(192)

我想按如下方式对csv进行排序,我想要的是
1.按列2排序
1.如果列相同,则按列3排序(数字)
我是这样做:

$ sort  -t","  -k2 -nk3  /tmp/test.csv
55b64670abb9c0663e77de84,525e3bfad07b4377dc142a24:9999,0.081032
5510b33ec720d80086865312,525e3bfad07b4377dc142a24:9999,0.081033
55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
5514548ec720d80086bfec46,525e3bfad07b4377dc142a24:9999,0.081035
551d4e21c720d80086084f45,525e3bfad07b4377dc142a24:9999,0.081036
557bff5276bd54a8df83268a,525e3bfad07b4377dc142a24:9999,0.081036

这个结果很奇怪,它先按列3排序,然后按列2排序

31moq8wy

31moq8wy1#

此命令似乎产生了正确的输出:

sort -t"," -k2,2 -k3,3n /tmp/test.csv

我使用逗号将顺序限制在该列,并使用数字(-n)开关切换到第三列的最后一个字符。
它产生:

55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
55b64670abb9c0663e77de84,525e3bfad07b4377dc142a24:9999,0.081032
5510b33ec720d80086865312,525e3bfad07b4377dc142a24:9999,0.081033
5514548ec720d80086bfec46,525e3bfad07b4377dc142a24:9999,0.081035
551d4e21c720d80086084f45,525e3bfad07b4377dc142a24:9999,0.081036
557bff5276bd54a8df83268a,525e3bfad07b4377dc142a24:9999,0.081036
qvsjd97n

qvsjd97n2#

排序将工作排序数据的csv & txt文件,它会打印输出的控制台
-t表示列由'|',-k1 -k2表示--它将按列1排序数据,然后按列2排序

$ sort -t '|' -k1 -k2 <INPUT_FILE>

要将结果存储在输出文件中,请使用以下命令

$ sort -t '|' -k1 -k2 <INPUT_FILE> -o <OUTPUTFILE>

如果你想忽略标题行,那么使用下面的命令

(head -n1 INPUT_FILE && sort <(tail -n+2 INPUT_FILE)) > OUTPUT_FILE

head -n1 INPUT_FILE,只打印文件的第一行,即标题
这个特殊的tail语法从第二行到EOF获取文件。

j1dl9f46

j1dl9f463#

虽然sort命令有一些技巧可以部分处理CSV文件,但它不能处理所有CSV格式的特性。csvsort是一个很好的选项:

csvsort -c 2,3 /tmp/test.csv

相关问题