Sort
對 CSV 文件進行排序,但不是標題
我需要對 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
的-k
ey 參數至少暗示了每個參數的-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
…一個 POSIX
sort
列印…|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-
…對於任何實現都可以肯定的事情