排序时忽略可选的前导字符串

时间:2016-08-08 15:14:26

标签: bash sorting

是否有一种有效的方法对文件进行排序,同时忽略出现在某些行开头的字符串?

例如,假设我有一个这样的文件列表:

FileAardvark
FileBee
N-FileBear
N-FileCat
FileZebra

我想在忽略" N - "时排序,所以排序后的结果将是

FileAardvark
N-FileBear
FileBee
N-FileCat
FileZebra

我不需要直接编辑线条,否则我可以直接删除N - '从文件完全。我最初的想法是使用' N - '作为sort的分隔符,但由于' N - '是多个字符,因为那时我需要的列号因行而异。

在我的特定情况下,碰巧所有字符串都以相同的术语开头(例如,在示例中,一切都有"文件"在开头)我需要对整个字符串进行排序剩下的一行,所以我最终使用了这个sed / sort链,这给了我想要的结果:

sed -e 's/File/\x06/g' | sort -t$'\x06' -k2 | sed -e 's/\x06/File/g'

但是,我不能依赖于与排序相关的所有字符串开头的重复序列,那么如何以更一般的方式完成此操作呢?

1 个答案:

答案 0 :(得分:3)

简单的方法是在字段前面添加N-前置字段,对该字段进行排序,然后将该前缀删除。

使用GNU sed(拥有-r;使用MacOS或其他现代BSD sed替换-E):

sed -r -e 's/^((N-)?([^ ]*))/\3 \1/' <<<"$str" | sort | sed -r -e 's/[^ ]+ //'

...这与通过修改时间对文件进行排序的首选方法非常类似 - 它将修改时间放在NUL分隔的流中的每个名称之前(因为NUL是文件中不存在的唯一字符&# 39; s pathname),按该初始字段排序,然后将其剥离。