2016-08-08 3 views
0

一部の行の先頭に表示される文字列を無視してファイルを並べ替える効率的な方法はありますか?ソート時にオプションの先頭文字列を無視する

例えば、私はこのようなファイルのリストを持っていると言う:

FileAardvark 
FileBee 
N-FileBear 
N-FileCat 
FileZebra 

そして、私は「N-」を無視してソートしたいので、ソートされた結果は

FileAardvark 
N-FileBear 
FileBee 
N-FileCat 
FileZebra 

だろう私は線を直接編集しないでください。そうしないと、ファイルから「N-」を取り除くことができます。私の最初の考えは、sortの区切り文字として 'N-'を使用することでしたが、 'N-'は複数の文字であり、必要な列番号が1行ごとに異なるため失敗します。

私の特別なケースでは、すべての文字列が同じ用語で開始されていた(例では、すべてが "File"を最初に持っています)、残りの行全体を並べ替える必要がありました。しかし、私はに関連するすべての文字列の先頭に重複配列を有するに依存することはできません

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

:私は私が望んでいた結果を得た。このsed/sortチェーンを使用して終了しました並べ替え、より一般的な方法でこれをどのように達成できますか?

答えて

3

簡単な方法は、N-の行を先頭に取り除き、そのストリームをソートしてから、そのプリフィックスを取り除くことです。

GNU sedので

-r持つ、MacOSのか、他の近代的なBSD sed代替-Eで):

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

...これは、更新時刻でファイルをソートする好ましいアプローチに非常に似ている - その場所NULで区切られたストリーム内の各名前の前の変更時刻(NULはファイルのパス名に存在できない唯一の文字なので)は、その最初のフィールドでソートしてから削除します。

+0

私はこれを正しく追跡していると思います。つまり、 '$ string_to_sort_by'(最初の' sed'の '\ 3')を抽出し、各行に' $ string_to_sort_by $ delimeter'を付加して並べ替え、 '$ delimeter'まで行の先頭を取り除きます。右? – SnoringFrog

+0

Spot on。区切り文字がstring_to_sort_byに存在しないことを確認する必要がありますが、これは唯一の制限です。 –

関連する問題