根据字符的最后一次出现进行排序

根据字符的最后一次出现进行排序

我想根据以下内容对文件进行排序

  • 文本第一个逗号,而且
  • YYYYMMMDD想要根据示例输入中的日期进行二级排序:

示例输入:

AX,NO,NO,\PathAX/subj/defn/some-file-name-20151229.txt,
CXX,NO,NO,\PathCXX/subj/defn/some-file-name-20151229.txt,
CXX,YES,YES,\Path/subj/defn/some-file-20140503.txt,6
DY,YES,MAYBE,\PathDY/subj/defn/some-file-name-20140720.txt,6

我可以用 解决第一部分sort -t, -k1,1,但不知道如何每天执行第二部分,因为文件名中的破折号数量不固定。因此我不能只用 a-作为分隔符指定列号。

期望的输出:

AX,NO,NO,\PathAX/subj/categ/some-file-name-20151229.txt,
CXX,YES,YES,\Path/subj/categ/some-file-20140503.txt,6
CXX,NO,NO,\PathCXX/subj/categ/some-file-name-20151229.txt,
DY,YES,MAYBE,\PathDY/subj/categ/some-file-name-20140720.txt,6

笔记:

我认为它有帮助:

  • 以下YYYYMMDD最后的文件名和文件扩展名之前的破折号。
  • 前面的破折号YYYYMMDD始终存在,因此至少有一个破折号。
  • 除了文件扩展名之外,文件中没有其他点。

我可以想到一个两遍过程,其中最后一个-被替换为文件中不会出现的其他字符,然后排序并用破折号替换该字符,但想知道是否有更简单的方法。

平台:

  • 苹果系统 10.9.5

答案1

解决此类问题的通用方法(对无法描述为th 行)是重写行以在前面添加排序键,然后排序,然后删除排序键。您可以使用更灵活的工具(例如 sed 或 awk)来确定排序键。

我不知道你到底是如何确定日期的。我将选择该行的最后一个 8 位数字序列,并根据需要进行调整。

sed 's/.*\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)/\1,&/; t; s/^/,/' |
sort -t, -k2,2 -k1,1 |
cut -d, -f 2-

如果该行不包含任何 8 位数字的序列,则 sed 脚本中的位t; s/^/,/会在前面添加一个逗号,否则最后一步将删除第一个逗号分隔的字段。

答案2

你可以使用这样的东西:

rev text | sed 's/-/,/1' | rev | sort -t, -k1,1 -k5,5 | rev | sed 's/,/-/2' | rev

其中文本是包含您内容的文件。如果时间戳后面有一个逗号,并且文件名中没有逗号,则此方法有效。

它实际上是做什么的?

  1. 反转线
  2. 将反转行中的第一个“-”更改为“,”(这实际上是实行中的最后一个“-”)
  3. 再次翻转它,使其与真实的线相匹配
  4. 现在对第一个和第五个字段(日期时间)进行排序,并使用“,”作为字段分隔符
  5. 再次反转
  6. 将第二次出现的“,”更改为“-”(恢复到之前的状态)
  7. 反转并打印输出

相关内容