如果名称和日期之间的空格数不同,我该如何按日期对文件进行排序?

如果名称和日期之间的空格数不同,我该如何按日期对文件进行排序?

如果名称和日期之间的空格数不同,我该如何按日期对文件进行排序?我的示例文件:

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日期格式。;)它们会自然地正确排序。

相关内容