2016-04-08 2 views
0

Я использую PHP файл, который выполнить СЕПГ:удалить первые два полукокса из каждой строки в текстовом файле -sed

shell_exec("C:\\cygwin64\\bin\\bash.exe --login -c 'sed -i -r \'s/.{2}//\' $text_files_path/File.txt 2>&1'"); 

Это заявление будет удалить первые 2 символа из file.txt. Как удалить первый символ из (каждой строки) в файле?

File.text:

< TTGCATGCAAAAATTT 
< AAAAAAATTTTGCTGA 
< AAGGTTCCCCCTTAGT 

Edit 1:

shell_exec("C:\\cygwin64\\bin\\bash.exe --login -c 'sed -i -r 's/^..//' $text_files_path/File.txt 2>&1'"); 

Это работает, но это сцепить все линии вместе: File.text после вышеуказанной команды:

TTGCATGCAAAAATTTAAAAAAATTTTGCTGAAAGGTTCCCCCTTAGT 
+0

Я не знаю, откуда у вас возникла мысль, что вы должны называть sed через bash с PHP, но это определенно ** не является правильным способом сделать это. Откройте файл и прочитайте строки в PHP. Если все, что вы хотите сделать, это удалить первые два символа, вам даже не нужно использовать регулярные выражения; простая '$ line = substr ($ line, 2);' будет лучшим вариантом. –

+0

@Tom Fenech Я использую файл более 70 ГБ. – sara

+0

Использование 'sed -i' не делает ничего волшебного - вам все равно придется создать две копии вашего огромного файла. Вы должны использовать PHP, открыть входной файл и записать подстроку в другой файл. –

ответ

0

Пожалуйста, не называйте СЭД через Баш, чтобы сделать что-то, что PHP может сделать изначально. Это полный анти-шаблон. Тревожит, я видел точно такую ​​же вещь в другом вопросе совсем недавно ...

Я надеюсь, что у вас есть много свободного места на диске:

$input_filename = "$text_files_path/File.txt"; 
$output_filename = 'path/to/temp/output.txt'; 

$input_file = fopen($input_filename, 'rb'); 
$output_file = fopen($output_filename, 'wb'); 

while (($line = fgets($input_file)) !== false) { 
    fwrite($output_file, substr($line, 2)); 
} 

fclose($input_file); 
fclose($output_file); 

rename($output_filename, $input_filename); 

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

Прочитайте каждую строку ввода и напишите подстроку со второго символа на временный вывод.

Закройте оба файла, а затем перезапишите ввод временным файлом.

Технически это может быть реализовано на месте, но результирующий скрипт будет намного сложнее, и вы рискуете повредить ваш входной файл, если все пошло не так.

0

Если вы просто хотите использовать PHP, то вы можете explode() файл на отдельные строки, а затем использовать substr() падать первые два символа до вступления строки обратно в одну строку, разделенной с новой строкой:

// Set the results array. 
$result = array(); 

// Split the file into lines. 
$file = $text_files_path . '/File.txt'; 
$lines = explode("\n", $file); 

// Cut the first two characters of each line and add to the results array. 
foreach($lines AS $line) { 
    $result[] = substr($line, 2); 
} 

// Split the result back into lines. 
$result = implode("\n", $result); 
+0

Я использую файл 70 ГБ. Будет ли это успешно работать? – sara

+0

О, дорогой, нет :) Используйте bash в этом случае, @MarcoS, похоже, находится на корпусе. – Egg

+0

Код макроса не работает. TheProphetOfRa делает, но объединяет все линии. – sara

0

s/^..// Это должно дать вам результат вам нужно.

^ указывает на начало строки, то . будет соответствовать любому символу

+0

Это прекрасно работает. Но почему он объединяет все линии вместе? Я имею в виду, что он производит: TTGCATGCAAAAATTTAAAAAAATTTTGCTGAAAGGTTCCCCTTAGT – sara

+0

@sara, вероятно, из-за того, что вы используете инструмент UNIX для обработки файла, который использует окончание строк в стиле Windows. –

+0

@Tom Fenech Итак? нет решения для удаления первого символа 2 без объединения всех строк? – sara

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