我正在尝试按日期字段对文件进行排序。我意识到这以前已经做过了,但是,我找不到具有以下日期格式的示例。
Canada Goose + 1x03 + For the Triumph of Evil + Sep/30/2013
Rucksack + 10x03 + Everybody's Crying Mercy + Oct/03/13
Test + 4x01 + Season 4, Episode 1 + Jun/01/14
New Family + 3x03 + Double Date + Oct/01/2013
我尝试了这个命令,但它不起作用
sort -t '+' -k 4.8,4.11 -k 4.4M -k 4.1,4.2 -b Test.txt
如果您安装了GNU awk,您可能需要尝试这种方法。
排序.awk
#!/bin/gawk -f
function convertToSeconds(date, fields) {
split(date, fields, ///)
fields[1]=months[tolower(fields[1])]
fields[2]=sprintf("%02d", fields[2])
fields[3]=(length(fields[3]) == 2) ? sprintf("2%03d", fields[3]) : fields[3]
return mktime(sprintf("%s %s %s 00 00 00", fields[3], fields[1], fields[2]))
}
BEGIN {
FS="( \+ )"
months["jan"]="01"; months["feb"]="02"; months["mar"]="03"; months["apr"]="04"
months["may"]="05"; months["jun"]="06"; months["jul"]="07"; months["aug"]="08"
months["sep"]="09"; months["oct"]="10"; months["nov"]="11"; months["dec"]="12"
}
{
arr[convertToSeconds($4)]=$0
}
END {
asorti(arr, dst)
for(i=1; i<=FNR; ++i) {
print arr[dst[i]]
}
}
给它一个执行权限,然后运行它:
$ chmod +x ./sort.awk
$ ./sort.awk Test.txt
要将更改保存到新文件中,请附加此>
运算符。
$ ./sort.awk Test.txt > SortedTest.txt
**UPDATE 1**
修改排序键,明确列出4位年份作为前缀,以避免年底交叉问题
由于OP只想排序日期字段,因此根本不需要精确的时期映射::
一列是原始日期生成顺序(正确的排序(,最后一列是计算的排序索引值-我测试了从mawk '$++NF = 366 * ( (_=($3) % 100) + 1900 + 100 * (_<50) ) + int(_ * 10^8) + ($2) + (31) * (index(" JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC", toupper($2)) / 3 - 1)'
jan 1st 1950
到dec 31 2025
的每个日期,这种简单的方法对顺序进行排序很好,即使它不需要计算精确的儒略日期或精确的闰年,因为目标只是找到一种秩排序方法,该方法产生与精确历元秒相同的排序输出
您已接近目标。例如,使用sed
添加缺失的世纪则第二个KEYDEF
字段的M
选项与GNUsort
:一起工作
sed 's:/([0-9][0-9])$:/201:' << 'HERE' |
f1 + f2 + f3 + NoV/30/15
f1 + f2 + f3 + Sep/30/2013
f1 + f2 + f3 + Oct/03/13
f1 + f2 + f3 + Jun/01/14
f1 + f2 + f3 + Oct/01/2013
f1 + f2 + f3 + mAr/11/11
f1 + f2 + f3 + oct/03/2013
f1 + f2 + f3 + juL/17/1998
HERE
LC_ALL=C sort -t '+' -k 4.9 -k 4.2M,4.4 -k 4.6,4.7
输出:
f1 + f2 + f3 + juL/17/1998
f1 + f2 + f3 + mAr/11/2011
f1 + f2 + f3 + Sep/30/2013
f1 + f2 + f3 + Oct/01/2013
f1 + f2 + f3 + Oct/03/2013
f1 + f2 + f3 + oct/03/2013
f1 + f2 + f3 + Jun/01/2014
f1 + f2 + f3 + NoV/30/2015