【问题标题】:Ignore optional leading string when sorting排序时忽略可选的前导字符串
【发布时间】:2016-08-08 23:21:05
【问题描述】:

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

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

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'

但是,我不能依赖在与排序相关的所有字符串的开头都有一个重复的序列,那么我怎样才能以更一般的方式完成此操作?

【问题讨论】:

    标签: bash sorting


    【解决方案1】:

    简单的方法是在行前添加一个带有 N- 的字段,对该流进行排序,然后去掉该前缀。

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

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

    ...这与按修改时间排序文件的首选方法非常相似——将修改时间放在 NUL 分隔的流中的每个名称之前(因为 NUL 是文件路径名中唯一不存在的字符),按该初始字段排序,然后将其剥离。

    【讨论】:

    • 我认为我正确地遵循了这一点。换句话说:提取$string_to_sort_by(第一个sed中的\3),将$string_to_sort_by$delimeter添加到每一行,排序,然后将行首剥离到$delimeter。对吗?
    • 正确。需要确保您的分隔符不会存在于 string_to_sort_by 中,但这是唯一的限制。
    猜你喜欢
    • 2014-01-20
    • 2012-10-02
    • 2011-05-13
    • 2021-11-27
    • 2011-08-28
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多