排序我在bash是新来的脚本,我们的教授有我们在排序上使用第三个字段的日期格式BASH脚本按日期
peas|10.00|05 Apr 2012
pea soup|10.00|05 Jan 2012
ham|10.00|06 Apr 2012
文件,与最近的项目显示在上面。 我试过使用过滤器组合和排序,但他们没有工作。谁能帮我?感谢
排序我在bash是新来的脚本,我们的教授有我们在排序上使用第三个字段的日期格式BASH脚本按日期
peas|10.00|05 Apr 2012
pea soup|10.00|05 Jan 2012
ham|10.00|06 Apr 2012
文件,与最近的项目显示在上面。 我试过使用过滤器组合和排序,但他们没有工作。谁能帮我?感谢
$ 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
尝试
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
很酷。为了记录,月排序是GNU特有的功能。它可能不适用于其他Unices。 – C2H5OH 2012-04-06 11:03:08
真棒的人,我也能够使用这个来排序其他项目格式。谢谢! – segfaulter09 2012-04-06 15:20:32
@ segfaulter09请考虑接受这个答案,如果它有帮助。 – kev 2012-04-12 16:03:46
到千电子伏的答案类似,这里有一个不使用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
可以使用,排序,然后剥光它。
这种技术被称为[Schwartzian变换](https://en.wikipedia.org/wiki/Schwartzian_transform) – 2012-04-06 14:30:58
感谢人,长期但坚实 – segfaulter09 2012-04-06 15:35:47
这可能会为你工作(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/^[^ ]* //'
为downvote任何原因? – kev 2012-04-06 11:59:07
谢谢你的回答和即兴awk介绍ahaha – segfaulter09 2012-04-06 15:36:49