如何使用unix排序进行自定义排序?

14 unix sorting

我正在使用 unix sort 对具有多列的逗号分隔文件进行排序。到目前为止,这对于按数字或字母顺序对数据进行排序非常有效:

任何排序前的示例文件:

C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Run Code Online (Sandbox Code Playgroud)

对文件进行排序: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv

排序结果:

A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Run Code Online (Sandbox Code Playgroud)

这是问题:我想根据自定义排序对第 2 列进行排序,这意味着我首先要美国,然后是加拿大,然后是巴哈马:

期望排序:

A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Run Code Online (Sandbox Code Playgroud)

有什么方法可以通过 unix sort 自定义排序顺序,然后它可以应用吗?就像是: $ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv

谢谢!

Lev*_*sky 9

另一个答案和评论大体上回答了这个问题,以下是实现的样子:

$ cat order
Bahamas,3
Canada,2
United States,1

$ cat data
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1

$ sort -t, -k2 data | join -t, -11 -22 order - | sort -t, -k2n -k4,5 -k6r -k7nr | cut -d, -f 3,1,4-7
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Run Code Online (Sandbox Code Playgroud)