如果名称和日期之间的空格数不同,我该如何按日期对文件进行排序?我的示例文件:
Ivanov 03/01/1980
Petrov 10/05/1992
Sidorov 21/07/1985
Kovtun 15/09/1976
Volnii 06/11/2000
Anisin 20/04/1998
Kovalenko 25/08/1982
Antonov 18/12/1990
Vlasenko 09/02/1987
Artiukh 30/10/1995
Shevchenko 26/05/2004
我尝试过类似的东西,但没有用
sort -k2,2 name_and_birthday.txt > sorted_by_birth.txt
这是可行的,但是它会删除多余的空格,但是以使用 awk 和删除多余的空格为代价,这个选项对我来说不起作用。
sort -k 2.7,2.10 -k 2.4,2.5 -k 2.1,2.2 -t ' ' -u <(awk '{$1=$1}1' name_and_birthday) > sorted_by_birth.txt
答案1
我找到了一个解决方案:
sort -b -k2.7,2.10 -k2.4,2.5 -k2.1,2.2 name_and_birthday.txt > sorted_by_birth.txt
-b
:此选项告诉 sort 忽略每行的前导空白。-k
:此选项指定用于排序的键。在您的例子中,您指定了三个以逗号分隔的键:2.7,2.10
:根据每行第二个字段(列)的第 7 到第 10 个字符进行排序。这可能是出生日期的年份部分。2.4,2.5
:根据第二个字段的第 4 到第 5 个字符进行排序2.1,2.2
:根据第二个字段的 1 到 2 个字符进行排序
最后,name_and_birthday.txt
是输入文件,排序后的输出重定向到名为的文件sorted_by_birth.txt
。
答案2
为了好玩,gawk
唯一的实现(非常复杂):
$ cat a
{
split($2,d,"/")
a[d[3]d[2]d[1]]=$0
}
END{
n=asorti(a,b)
for (i=1;i<=n;i++){
print a[b[i]]
}
}
像这样运行:
$ awk -f a example
Kovtun 15/09/1976
Ivanov 03/01/1980
Kovalenko 25/08/1982
Sidorov 21/07/1985
Vlasenko 09/02/1987
Antonov 18/12/1990
Petrov 10/05/1992
Artiukh 30/10/1995
Anisin 20/04/1998
Volnii 06/11/2000
Shevchenko 26/05/2004
必须使用才能split
到达那里,这为使用提供了强有力的理由ISO 8601日期格式。;)它们会自然地正确排序。