2015-06-11 6 views
3

Я читаю файл в bash, беря значения и сохраняя их в другом файле. В файле есть ~ 100k строк, и для чтения и перезаписи их требуется около 25 минут.Быстрая запись bash в файл

Есть, возможно, некоторые более быстрый способ для записи в файл, потому что теперь я просто перебор строк, разбора некоторых значений и сохранение их как это:

while read line; do 
    zip="$(echo "$line" | cut -c 1-8)" 
    echo $zip 
done < file_one.txt 

Все работает отлично, значение правильно разобрался, я просто хочу знать, как я могу оптимизировать процесс (если даже могу).

Благодаря

+1

Хотя чтение циклов смехотворно медленное – 123

ответ

4

Петля Баш только замедляет его (особенно в той части, где вы вызываете внешнюю программу (cut) один раз на одну итерацию). Вы можете сделать все это в один cut:

cut -c 1-8 file_one.xt 
+0

Это напечатает результат для каждой строки назад. Я не уверен, какой смысл назначения zip-переменной в исходном коде. – PSkocik

+0

Забыл (а): Я использую цикл, потому что позже мне нужно будет проверить некоторые другие значения после этого. Другое значение нужно будет сократить в зависимости от его содержимого (мне нужно будет добавить «если»). Отличная идея, но я не уверен, могу ли я ее использовать, когда добавляю это ... – Luka

+1

Затем проведите это в свой цикл while. Это ускорит многое. Петли Bash медленны, но гораздо медленнее вызывается исполняемый файл на каждую итерацию, что и делается сейчас. – PSkocik

1

Если вы хотите, чтобы действовать на подстроках линии, если она удовлетворяет некоторое условие, Awk создан для работы с текстовыми файлами:

awk '{zip=substr($0, 1, 8)} zip == "my match" {print zip}' file_one.txt 

В этом примере substr($0, 1, 8) представляет символы с 1 по 8 каждой строки записи ($0) file_one.txt. Эти подстроки присваиваются переменной zip и печатаются только при сопоставлении текста "my match".

Если вы не знакомы с Awk и обычно имеете большие файлы, которые нужно манипулировать, я рекомендую потратить некоторое время, чтобы изучить его. Awk загружается быстрее и эффективнее, чем петли считывания bash. Сообщение в блоге - Awk in 20 Minutes - это хорошее, быстрое введение.

Чтобы сэкономить больше времени на больших файлах, вы можете использовать оптимизированную для скорости версию Awk под названием Mawk.

2

Вызов cut один раз для каждой линии - большая горловина бутылки. Используйте расширение подстроки вместо того, чтобы захватить первые 8 символов каждой строки.

while read line; do 
    zip=${line:0:8} 
    echo $zip 
done < file_one.txt