Linux排序显示奇怪的行为

时间:2014-07-02 07:12:37

标签: linux sorting

我有一个脚本,需要按数字顺序CAT CAT一些文件。虽然它似乎与几百个文件一起正常工作,但我现在在处理更大的文件时遇到了一些“有趣”的结果。

有问题的文件已拆分为1289个单独的文件,名为ABC.001-1289至ABC.1289-1289

我正在使用“ls -gGo ABC * | sort -hk9”来列出我认为的文件,一个人类可读的排序顺序。一切顺利,直到我点击ABC.763-1289:

ABC.001-1289 .. ABC.763-1289
ABC.1000-1289 .. ABC.1040-1289 
ABC.764-1289 .. ABC.999-1289
ABC.1041-1289 .. ABC.1289-1289

我正在考虑某种缓冲区溢出或其他什么,但我之前没有经历过这样的事情,而且我有点想到我甚至会开始寻找补救问题的地方。

我尝试改变“k”值甚至删除它,但收效甚微。

我越是关注这个,我越相信需要KEYDEF,但我无法确定使用它的正确格式....

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我不想开始调试shell内置的sort函数。那么为什么不在shell之外使用不同的排序呢? 例如,我使用python:

#!/usr/bin/python2.7
import argparse, sys, re

parser = argparse.ArgumentParser( description='concatenate the input files by order',
                                  formatter_class=argparse.ArgumentDefaultsHelpFormatter )
parser.add_argument( 'input', nargs='+', help='the paths to the files to be concatenated' )
parser.add_argument( '-n','--nosort', action='store_true', help='use the given order instead of sorting' )
parser.add_argument( '-o','--output', default='', help='output file. Will output to stdout if empty' )
args = parser.parse_args()

def human_keys( astr ):
    """
    alist.sort(key=human_keys) sorts in human order
    From unutbu @ http://stackoverflow.com/questions/5254021
    """
    keys=[]
    for elt in re.split( '(\d+)', astr ):
        elt = elt.swapcase()
        try: 
            elt = int(elt)
        except ValueError: 
            pass
        keys.append( elt )
    return keys

if not args.nosort:
    args.input.sort( key = human_keys )

output = args.output and open( args.output, 'w' ) or sys.stdout

for path in args.input:
    with open( path, 'r' ) as in_file:
        for line in in_file:
            output.write(line)

if output != sys.stdout:
    output.close() # not really needed. But tidier. Can put it in an "atexit", but that's an overkill.

答案 1 :(得分:1)

有点hacky但是试试这个:

 ls -gGo ABC* |cut -d "." -f 2 |sort -h

ls -gGo ABC* |cut -b 5- |sort -h