2013-03-20 2 views
1

У меня есть файл tbook1 с множеством числовых значений (+ 2M). Я должен выполнить ниже в Баш (Solaris/RHEL):Какое из двух лучше в манипулировании файлами?

Do following: 
Remove 1st and last 2 lines 
Remove (,") & (") 
Substitute (,) with (,) 

я могу сделать это с помощью двух методов:

Method1: 
sed -e 1d -e 's/,"//g' -e 's/, /,/g' -e 's/"//g' -e 'N;$!P;$!D;$d' tbook1 > tbook1.3 

method2: 
tail -n +2 tbook1 | head -n -2 > tbook1.1 
sed -e 's/,"//' -e 's/, //' tbook 1.1 > tbook1.2 

Я хочу знать, какой из них лучше т.е. быстрее & эффективным (ресурс Применение) ?

+0

Вы можете обновлять файлы на месте? – tjameson

+0

нет .. Я не могу сделать на месте ... Я должен сохранить оригинальную «книгу» неповрежденной! – Marcos

ответ

1

Метод 1, как правило, быть более эффективными, в основном из-за 2-й способ по дополнительной трубе и промежуточный файл, который будет чтение и запись ..

1

Метод один сканирует файл только один раз и записывает 1 результат (но, пожалуйста, храните результат в файле с другим именем) Метод два 2 сканирует исходный файл и промежуточный результат и записывает промежуточный и конечный результат. Он должен быть примерно в два раза медленнее.

+0

Спасибо за обновление! – Marcos

1

Я думаю, что head и tail более эффективны для этой задачи ликвидации линии, чем чистый sed. Но другие два ответа также верны. Вам следует избегать запуска нескольких проходов.

Вы можете улучшить второй метод, приковав их вместе:

tail -n +2 book.txt | head -n -2 | sed -e 's/,"//' -e 's/, //' 

Тогда head и tail быстрее. Попробуйте сами (на разумном файл размером):

#!/usr/bin/env bash 

target=/dev/null 

test(){ 
     mode=$1 
     start=$(date +%s) 
     if [ $mode == 1 ]; then 
       sed -e 1d -e 's/,"//g' -e 's/, /,/g' -e 's/"//g' -e 'N;$!P;$!D;$d' book.txt > $target 
     elif [ $mode == 2 ]; then 
       tail -n +2 book.txt | head -n -2 | sed -e 's/,"//' -e 's/, //' > $target 
     else 
       cat book.txt > /dev/null 
     fi 

     ((time = $(date +%s) - $start)) 
     echo $time "seconds" 
} 

echo "cat > /dev/null" 
test 0 

echo "sed > $target" 
test 1 

echo "tail/head > $target" 
test 2 

Мои результаты:

cat > /dev/null 
0 seconds 

sed > /dev/null 
5 seconds 

tail/head > /dev/null 
3 seconds 
+0

Спасибо, Юве, Кажется, у меня высокий персидский сервер ... :)! Я побежал выше тест на файл (довольно большой), и ниже результат: [корень @ cntosmhvtl2 прод] # ./perftest.sh кошка>/DEV/нуль 0 секунд СЕПГ>/DEV/нуль 0 секунд хвост/голова>/DEV/нуль 0 секунд [корень @ cntosmhvtl2 прод] # туалет book.csv 4230 71288 1244096 book.csv – Marcos

+0

Я думаю, что я буду придерживаться SED версии ... Похоже, что Solaris серверы не поддерживают хвост | голова комбо !! – Marcos

+0

Да, версия POSIX 'head' не принимает отрицательное число после' -n'. @Marcos – Scrutinizer

Смежные вопросы