我想根据以下内容对文件进行排序
- 文本前第一个逗号,而且
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
其中文本是包含您内容的文件。如果时间戳后面有一个逗号,并且文件名中没有逗号,则此方法有效。
它实际上是做什么的?
- 反转线
- 将反转行中的第一个“-”更改为“,”(这实际上是实行中的最后一个“-”)
- 再次翻转它,使其与真实的线相匹配
- 现在对第一个和第五个字段(日期时间)进行排序,并使用“,”作为字段分隔符
- 再次反转
- 将第二次出现的“,”更改为“-”(恢复到之前的状态)
- 反转并打印输出