是否有一种有效的方法来对文件进行排序,同时忽略出现在某些行开头的字符串?
例如,假设我有一个这样的文件列表:
FileAardvark
FileBee
N-FileBear
N-FileCat
FileZebra
Run Code Online (Sandbox Code Playgroud)
我想在忽略“N-”的同时进行排序,因此排序结果将是
FileAardvark
N-FileBear
FileBee
N-FileCat
FileZebra
Run Code Online (Sandbox Code Playgroud)
我不需要直接编辑这些行,否则我可以从文件中完全删除“N-”。我最初的想法是使用 'N-' 作为 的分隔符sort,但这失败了,因为 'N-' 是多个字符,而且我需要的列号因行而异。
在我的特定情况下,所有字符串都以相同的术语开头(即,如示例中所示,所有内容都以“File”开头),并且我需要对整个剩余行进行排序,所以我最终使用这个sed/sort链,这得到了我想要的结果:
sed -e 's/File/\x06/g' | sort -t$'\x06' -k2 | sed -e 's/\x06/File/g'
但是,我不能依赖于在与排序相关的所有字符串的开头有一个重复的序列,那么如何以更通用的方式实现这一点呢?
N-简单的方法是在行的前面添加一个带有剥离的字段,对该流进行排序,然后剥离该前缀。
使用 GNU sed(使用-r; 使用 MacOS 或其他现代 BSDsed替代品-E):
sed -r -e 's/^((N-)?([^ ]*))/\3 \1/' <<<"$str" | sort | sed -r -e 's/[^ ]+ //'
Run Code Online (Sandbox Code Playgroud)
...这与按修改时间对文件进行排序的首选方法非常相似——它将修改时间放在 NUL 分隔流中的每个名称之前(因为 NUL 是唯一不能存在于文件路径名中的字符),排序通过该初始字段,然后将其剥离。