Date
Bash:按月,日對日期的CSV進行排序
我沒有成功地尋找解決這個問題的方法。
我有一個包含日期欄位的 CSV 文件,我試圖按月和日進行排序。
CSV 格式:
name,email,phone,date
日期欄位格式
m/d/yy
為 1/3/84我可以按月排序
sort -t',' -n -k4 < $file`
但我不能把我的頭放在拆分日期欄位然後對 k1 和 k2 排序,如果這是有意義的或者甚至是遠端接近的話。
這顯然是錯誤的`
cat $file | sort -t',' -n -k4 | sort -t'/' -n -k1 -k2
因為輸出僅按天排序,並且 k1 包括第一個之前的所有內容
/
。期待學習,而不是被灌輸。
編輯:
CSV 樣本
Name,Email,Phone,Birthday MarkW.,email@email.com,(555) 444-4444,6/24/85 GeorgeT.,email@email.com,(555) 555-1413,4/2/82 BobA.,email@email.com,(555) 555-5050,11/15/85 TimP.,email@email.com,,4/11/18 JohnM.,email@email.com,(555) 555-1317,4/25/13 MikeT.,email@email.com,(555) 555-2114,4/10/91 BobR.,email@email.com,(555) 555-1383,7/13/14 TomW.,email@email.com,(555) 555-1980,12/25/08 JamesS.,email@email.com,(555) 555-2150,6/12/15 TimC.,email@email.com,(555) 555-8048,3/17/08 WallyG.,email@email.com,,7/21/00 KeithD.,email@email.com,,12/29/12 DaveM.,email@email.com,,1/10/48 DanMc.,email@email.com,(555) 555-6863,5/19/88 DickM.,email@email.com,(555) 555-9333,11/23/13 KenB.,email@email.com,(555) 555-6891,1/2/04 DaveMc.,email@email.com,, MichaelL.,email@email.com,(555) 555-1575,9/15/13 RoryB.,email@email.com,(555) 555-555,1/25/17
範例輸出,我能想出的最好的方法是使用
sort -t',' -n -k4 < $file
例如,預期輸出將是 1/10/84 出現在 04 年 1 月 2 日之後。
DaveMc.,email@email.com,, Name,Email,Phone,Birthday DaveM.,email@email.com,,1/10/48 KenB.,email@email.com,(555) 555-6891,1/2/04 RoryB.,email@email.com,(555) 555-555,1/25/17 TimC.,email@email.com,(555) 555-8048,3/17/08 GeorgeT.,email@email.com,(555) 555-1413,4/2/82 JohnM.,email@email.com,(555) 555-1317,4/25/13 MikeT.,email@email.com,(555) 555-2114,4/10/91 TimP.,email@email.com,,4/11/18 DanMc.,email@email.com,(555) 555-6863,5/19/88 JamesS.,email@email.com,(555) 555-2150,6/12/15 MarkW.,email@email.com,(555) 444-4444,6/24/85 BobR.,email@email.com,(555) 555-1383,7/13/14 WallyG.,email@email.com,,7/21/00 MichaelL.,email@email.com,(555) 555-1575,9/15/13 BobA.,email@email.com,(555) 555-5050,11/15/85 DickM.,email@email.com,(555) 555-9333,11/23/13 KeithD.,email@email.com,,12/29/12 TomW.,email@email.com,(555) 555-1980,12/25/08
它按月排序,但我也在嘗試按天排序
你可以用Miller做這樣的事情- 添加新的月份和日期欄位,按它們排序,然後刪除:
$ mlr --csvlite put ' dmy = splitnv($Birthday,"/"); $m = dmy[1]; $d = dmy[2] ' then sort -n m,d then cut -x -f m,d file.csv Name,Email,Phone,Birthday KenB.,email@email.com,(555) 555-6891,1/2/04 DaveM.,email@email.com,,1/10/48 RoryB.,email@email.com,(555) 555-555,1/25/17 TimC.,email@email.com,(555) 555-8048,3/17/08 GeorgeT.,email@email.com,(555) 555-1413,4/2/82 MikeT.,email@email.com,(555) 555-2114,4/10/91 TimP.,email@email.com,,4/11/18 JohnM.,email@email.com,(555) 555-1317,4/25/13 DanMc.,email@email.com,(555) 555-6863,5/19/88 JamesS.,email@email.com,(555) 555-2150,6/12/15 MarkW.,email@email.com,(555) 444-4444,6/24/85 BobR.,email@email.com,(555) 555-1383,7/13/14 WallyG.,email@email.com,,7/21/00 MichaelL.,email@email.com,(555) 555-1575,9/15/13 BobA.,email@email.com,(555) 555-5050,11/15/85 DickM.,email@email.com,(555) 555-9333,11/23/13 TomW.,email@email.com,(555) 555-1980,12/25/08 KeithD.,email@email.com,,12/29/12 DaveMc.,email@email.com,,