2012-04-06 63 views
2

排序我在bash是新來的腳本,我們的教授有我們在排序上使用第三個字段的日期格式BASH腳本按日期

peas|10.00|05 Apr 2012 
pea soup|10.00|05 Jan 2012 
ham|10.00|06 Apr 2012 

文件,與最近的項目顯示在上面。 我試過使用過濾器組合和排序,但他們沒有工作。誰能幫我?感謝

回答

3
$ cat input.txt | awk -F '|' '{sprintf("date +%%s -d \"%s\"", $3) | getline tm}; {print tm "\t" $0}' | sort | cut -f2- 
pea soup|10.00|05 Jan 2012 
peas|10.00|05 Apr 2012 
ham|10.00|06 Apr 2012 

如果你不想調用外部命令date做,
你可以寫在awk定製mktime2功能:

#!/bin/gawk -f 
# script.awk 

BEGIN { 
    FS="|" 
    m["Jan"] = "01" 
    m["Feb"] = "02" 
    m["Mar"] = "03" 
    m["Apr"] = "04" 
    m["May"] = "05" 
    m["Jun"] = "06" 
    m["Jul"] = "07" 
    m["Aug"] = "08" 
    m["Sep"] = "09" 
    m["Oct"] = "10" 
    m["Nov"] = "11" 
    m["Dec"] = "12" 
} 

{ 
    print mktime2($3) "\t" $0 | "sort | cut -f2-" 
} 

function mktime2(s, arr,yyyy,mm,dd) 
{ 
    split(s, arr, " ") 
    yyyy = arr[3] 
    mm = m[arr[2]] 
    dd = arr[1] 
    return mktime(sprintf("%s %s %s 00 00 00", yyyy, mm, dd)) 
} 

# make script executable 
$ chmod +x script.awk 

# run the script 
$ ./script.awk input.txt 
pea soup|10.00|05 Jan 2012 
peas|10.00|05 Apr 2012 
ham|10.00|06 Apr 2012 
+0

爲downvote任何原因? – kev 2012-04-06 11:59:07

+0

謝謝你的回答和即興awk介紹ahaha – segfaulter09 2012-04-06 15:36:49

16

嘗試

sort -t '|' -k 3.8,3.11nr -k 3.4,3.6Mr -k 3.1,3.2nr < input 
     ------ ------------- ------------ ------------ 
     sep first key  second key third key 
+2

很酷。爲了記錄,月排序是GNU特有的功能。它可能不適用於其他Unices。 – C2H5OH 2012-04-06 11:03:08

+0

真棒的人,我也能夠使用這個來排序其他項目格式。謝謝! – segfaulter09 2012-04-06 15:20:32

+1

@ segfaulter09請考慮接受這個答案,如果它有幫助。 – kev 2012-04-12 16:03:46

0

到千電子伏的答案類似,這裏有一個不使用awk

while IFS=\| read -r item price date ; do printf '%s|%s|%s|%s\n' "$(date +%s -d "$date")" "$item" "$price" "$date" ; done < table.txt | sort -n -t\| | cut -d\| -f2- 

的想法是添加一個字段sort可以使用,排序,然後剝光它。

+1

這種技術被稱爲[Schwartzian變換](https://en.wikipedia.org/wiki/Schwartzian_transform) – 2012-04-06 14:30:58

+0

感謝人,長期但堅實 – segfaulter09 2012-04-06 15:35:47

0

這可能會爲你工作(GNU排序):

sort -t'|' -k3.8,3.11nr -k3.4,3.6Mr -k3.1,3.2nr file 

或者(如果你沒有GNU排序):

sed '1{x;s/^/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/;x};G;s/\(.*|\(..\) \(...\) \(....\)\)\n.*\3\(..\).*/\4\5\2 \1/' file 
sort -nr | 
sed 's/^[^ ]* //'