我有一个脚本,需要按数字顺序对许多文件进行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,但是我无法确定使用此格式的正确格式。
有什么想法吗?
最佳答案
我不想开始调试内置在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.