Sort

對 CSV 文件進行排序,但不是標題

  • June 25, 2017

我需要對 CSV 文件進行排序,但標題行(第一行)一直在排序。這就是我正在使用的:

cat data1.csv | sort -t"|" -k 1 -o data1.csv 

這是一個範例行:

Name|Email|Country|Company|Phone 
Brent Trujillo|tempus@mauris.org|Burkina Faso|Donec LLC|(612) 943-0167

這應該工作並輸出到data2.csv

head -n 1 data1.csv > data2.csv &&
tail -n +2 data1.csv | sort -t "|" -k 1 >> data2.csv

我認為這裡的很大一部分問題是

... -k 1 ...

sort-key 參數至少暗示了每個參數的-k [num] 開始 ,[num] 結束引用。這實際上與完全不指定排序鍵沒有什麼-k 1不同,因為如果沒有結束引用sort,將從行首到行尾對行進行排序。

如果您只想sort在第一個|-delimited 欄位上添加行,則需要執行以下操作:

... -k1,1 ...

如果你這樣做了,並且如果你的第一行以then開頭|,那麼使用 GNUsort你可以這樣做……

sort -st\| -k1,1 <infile >outfile

…第一行將保持原樣 - 你會得到你想要的行為。

我在上面指定了 GNU sort,因為 POSIX 指定在用盡非唯一操作上的所有排序鍵後,sort將一行上的所有字節評估*為對比較有意義**(兩次 - 指定相鄰的等鍵行在第一次通過後至少刪除修飾符)*和相鄰的等鍵線保留。這意味著對於…-u``sort

printf '|%s\n' 9 1 | sort -nk1,1

…一個 POSIXsort列印…

|1
|9

…這可能是違反直覺的,因為第一個欄位 - 也是唯一與任何-k參數匹配的欄位 - 是完全空的。預設情況下,GNUsort也會列印相同的 ,但是當-s指定 table 排序選項時,它會列印…

|9
|1

…因為它不會以與唯一排序相同的方式評估命令行上指定的欄位所允許的任何行,-u儘管它不會刪除-s表排序的重複。

如果您的標題行是第一個並且您使用 GNU 進行排序,則根本不更改您的文件,sort您可以執行以下操作:

{ printf \|; cat file; } | 
sort -st\| -k1,1 | 
sed 's/.//;q'

…我認為,這將在標準輸出上為您提供所需的結果。

或者類似的東西……

{ printf \|; cat file; } | 
nl -ba -s\| |
sort -t\| -k2,2 -k1n,1 |
cut -d\| -f2-

…對於任何實現都可以肯定的事情

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