Linux

對 csv 文件進行排序時出現意外結果

  • April 9, 2021

我有以下 CSV 文件,如下所示,有 4 列,我正在從 bash 終端輸入文件名。

Sile,Barhams,Female,sba3@exe.com
Shae,Scotti,Male,mi5@exe.com
Shae,Bonham,Female,sm9@ex.org
Shay,Ert,Female,sep@emple.gov
Simeon,Dearle,Male,sz@e.net

期望的輸出是:

Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

現在我嘗試了以下程式碼片段並得到瞭如圖所示的結果:

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

有人可以解釋我的兩個片段以及如何獲得想要的片段嗎?根據我的第一個程式碼,我根據第一列排序,如果出現平局,我已經指定了穩定排序以獲得所需的輸出,但是 IDK 是什麼問題和在第二個程式碼中,我想知道“Sile”是如何出現在頂部的。

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

您會得到它,因為預設情況下-k引用的欄位是空白分隔Shae,Female的欄位,並且排序在Shae,Male.

您需要-t選擇告訴它使用逗號作為分隔符:

-t,--field-separator=SEP

使用 SEP 而不是非空白到空白的過渡

$ cat "$file"  | cut -d, -f1,3 | sort -t, -k 1,1 -s
Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

在這裡,使用-n,排序是基於數據的數值。但是這裡沒有數字字元串:所有非數字字元串都將被視為零。因此,實際上沒有主要的排序規則。使用-s,訂單將保持原樣。沒有-s,sort將退回到文本排序以獲得一些結果。

引用自:https://unix.stackexchange.com/questions/644258