Как указывает John1024, большим подозрением в медлительности является вызов cdrtoip 500 000 раз.
РЕДАКТИРОВАТЬ: на основе предоставленного скрипта cdrtoip вся реализация находится на Python. Это намного быстрее, потому что нет вызова внешнего скрипта.
Я бы порекомендовал вам взглянуть на Python для этого. Производительность Python довольно хороша для этого типа задач, также существует существующий модуль для обработки файлов csv, включенный в стандартную библиотеку python.
Вот пример реализации на Python. Этот образец читает и записывает в stdin / stdout, как ваш скрипт awk, но его можно легко изменить для открытия файлов. РЕДАКТИРОВАТЬ: лучше очищать и обрабатывать ошибки преобразования. Предоставьте сводку в stderr в конце обработки.
#!/usr/bin/python
import sys,csv
# Convert CISCO format (signed integer) to Hex
# Based on original cdrtoip script in bash
# Note that a ValueError is raised if conversion cannot be done.
def cdrtoip(addrfield):
intaddr=int(addrfield) # ValueError if not a valid int
# Range-check the integer, make it unsigned
# If out of range, raise a ValueError
if intaddr < 0: intaddr=intaddr+0x100000000
if intaddr < 0: raise ValueError
if intaddr > 0xffffffff : raise ValueError
return ".".join( [ str(intaddr >> i & 0xff) for i in (24,16,8,0) ] )
# There are other options, depending on the exact file format
# you want. See: https://docs.python.org/2/library/csv.html
indata=csv.reader(sys.stdin)
outdata=csv.writer(sys.stdout)
header=True
no_convert=0
invalid_row=0
row_converted=0
blank_row=0
for row in indata:
# Write the first line unchanged...
if header:
header=False
else:
# Note that columns are numbered from 0
if len(row) == 0:
blank_row=blank_row+1
continue
elif len(row) > 7:
try:
row[7]=cdrtoip(row[7])
row_converted=row_converted+1
except ValueError:
# if conversion fails, we count and leave the field unchanged.
no_convert=no_convert+1
else:
# if there is no column 8 we count as invalid row.
invalid_row=invalid_row+1
outdata.writerow(row)
# Print a summary of work done (to stderr).
print >> sys.stderr,"%d values converted." % row_converted
if no_convert > 0:
print >> sys.stderr,"%d values not converted." % no_convert
if invalid_row > 0:
print >> sys.stderr,"%d rows not valid." % invalid_row
if blank_row > 0:
print >> sys.stderr,"%d blank rows removed." % blank_row