文本处理:如何按字符串分隔的日期对列表进行排序

文本处理:如何按字符串分隔的日期对列表进行排序

我想file.txt按日期对内容进行排序。要排序的日期在第四个表数据<td></td>标签中

例如内容file.txt

<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Mar01</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Jan31</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Apr02</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Dec25</td></tr>

期望的输出:我怎样才能做到这一点?

<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Jan31</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Dec25</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Mar01</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Apr02</td></tr>

我一直在使用sort命令,但它不起作用。

cat file.txt 2> /dev/null | sort -t'>' -k9n -k9.4M -k9.7n

编辑:我找到了这个参考链接,但仍然无法正常工作。 https://stackoverflow.com/a/16060031/7842707

答案1

如果每个<tr>项目都在单独的行上:

awk+sort解决方案:

awk -F'[<>]' '{ print $(NF-4), $0 }' file.txt | sort -k1,1n -k1.5M | cut -d' ' -f2-
  • -F'[<>]'- 将<>视为字段分隔符
  • $(NF-4)- 包含每行的最后一个<td>标签值(例如)。2017Jan31这用作排序键。
  • -k1,1n- 按第一个字段数字排序(即按日期年份)
  • -k1.5M- 日期月份从第 5 个字符开始排序
  • cut -d' ' -f2-- 删除辅助排序键(第一个字段)

输出:

<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Jan31</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Dec25</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Mar01</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Apr02</td></tr>

相关内容