bash - Ignore optional leading string when sorting -


is there efficient way sort file while ignoring string appears @ beginning of lines?

for example, have list of files this:

fileaardvark filebee n-filebear n-filecat filezebra 

and want sort while ignoring "n-", sorted result be

fileaardvark n-filebear filebee n-filecat filezebra 

i need not edit lines directly, otherwise strip 'n-' file entirely. initial thought use 'n-' delimiter sort, fails both because 'n-' multiple characters , because column number need differs line line.

in particular case, happened strings started same term (i.e., in example, has "file" @ beginning) , needed sort on entirety of remaining line, ended using sed/sort chain, got me result wanted:

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

however, can't depend on having duplicated sequence @ beginning of strings relevant sorting, how can accomplish in more general way?

the easy approach prepend field n- stripped front of line, sort stream, strip prefix off.

with gnu sed (having -r; macos or modern bsd sed substitute -e):

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

...this similar preferred approach sorting files modification time -- places modification time before each name in nul-delimited stream (since nul character cannot exist in file's pathname), sorts initial field, strips off.


Comments