Search code examples
pythonfilesortinglines

python to sort lines in a text file based on the int value at the end of each line


I have a big text file like this:

train/1175-c/b0a5.bmp 45221
train/1175-c/b0a4.bmp 45220
train/1176-c/b0a4.bmp 45220
train/1176-c/b0a6.bmp 45222
train/1175-c/b0a1.bmp 45217
train/1173-c/b0a2.bmp 45218
train/1175-c/b0aa.bmp 45226
train/1172-c/b0a3.bmp 45219
train/1177-c/b0a4.bmp 45220
train/1177-c/b0a1.bmp 45217
train/1176-c/b0a1.bmp 45217
train/1178-c/b0a1.bmp 45217
train/1175-c/b0a8.bmp 45224
train/1175-c/b0a9.bmp 45225
train/1175-c/b0a7.bmp 45223

I want to sort it like the following and save a new file? sort based on the last int value in each line.

train/1178-c/b0a1.bmp 45217
train/1177-c/b0a1.bmp 45217
train/1176-c/b0a1.bmp 45217
train/1175-c/b0a1.bmp 45217
train/1173-c/b0a2.bmp 45218
train/1172-c/b0a3.bmp 45219
train/1175-c/b0a4.bmp 45220
train/1176-c/b0a4.bmp 45220
train/1177-c/b0a4.bmp 45220
train/1175-c/b0a5.bmp 45221
train/1176-c/b0a6.bmp 45222
train/1175-c/b0a7.bmp 45223
train/1175-c/b0a8.bmp 45224
train/1175-c/b0a9.bmp 45225
train/1175-c/b0aa.bmp 45226

Solution

  • Write a function and pass it as the key keyword argument to sorted

    def trailing_digits(string):
        return int(string.split()[-1])
    
    iterable = '''train/1175-c/b0a5.bmp 45221
    train/1175-c/b0a4.bmp 45220
    train/1176-c/b0a4.bmp 45220
    train/1176-c/b0a6.bmp 45222
    train/1175-c/b0a1.bmp 45217
    train/1173-c/b0a2.bmp 45218
    train/1175-c/b0aa.bmp 45226
    train/1172-c/b0a3.bmp 45219
    train/1177-c/b0a4.bmp 45220
    train/1177-c/b0a1.bmp 45217
    train/1176-c/b0a1.bmp 45217
    train/1178-c/b0a1.bmp 45217
    train/1175-c/b0a8.bmp 45224
    train/1175-c/b0a9.bmp 45225
    train/1175-c/b0a7.bmp 45223'''.split('\n')
    
    for x in sorted(iterable, key=trailing_digits):
        print(x)