Извлечение интересующих строк из одного файла и вывод их в другой файл - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть файл следующим образом

$ ###########################################################

$ # text           : text

$ # text            : text

$ # text   : text

$ # text   : text

$ # text : text

$ ###########################################################

.some text

$$.some text 

$ ###########################################################

$ # text           : text

$ # text           : text

$ #text            : text

$ # text           : text

$ # text           : text

$ ###########################################################


$# some text 

Извлекаемые строки:

Mg1.qna some text

Mg1.qpa text

эти две строки должны быть записаны в другой файл .........

У меня есть некоторая логика, но это естественно до метки ....... попробуйте 2 дать идеи, если таковые имеются

Ответы [ 3 ]

3 голосов
/ 07 апреля 2011

Самый простой способ определить, следует ли игнорировать строку, - это использовать string match, особенно когда задействован буквенный символ $ (это совсем не особенное значение для string match). Например:

set f [open $filename]
while {[gets $f line] >= 0} {
    if {[string match "$$*" $line] || [string match "$ #*" $line]} {
        # ignore by just going straight to the next loop iteration
        continue
    }
    # Do the rest of your processing here...
}
close $f

Обратите внимание, что хотя $ является метасимволом внутри строк, он заменяет сам себя, если за ним не следует буква, число, двоеточие или скобка. Точки, звездочки и пробелы в порядке, как указано выше. (В противном случае вам нужно поставить обратную косую черту, \, перед каждым символом доллара.)

0 голосов
/ 08 апреля 2011

Расширение решения, упомянутого drysdam в комментариях к вопросу

В оболочке вы используете следующее

grep ^ Mg file1> file2

Эту же команду можно выполнить изСценарий TCL тоже.

eval exec "grep ^ Mg file1> file2"

В действии:

==> tclsh% cat d1 Mg1 Mg2 Bg%

% eval exec "grep ^ Mg d1> d2" <<<<<<<<< Решение для TCL </p>

% cat d2 Mg1 Mg2

0 голосов
/ 07 апреля 2011

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

package require Tclx

set inputFilename [lindex $argv 0]
set outputFilename [lindex $argv 1]
set outputChannel [open $outputFilename w]

for_file line $inputFilename {
    # Only select those lines that does not start with '$' or '.'
    if [regexp {^[^\$\.]} $line] {
        puts $outputChannel $line
    }
}

close $outputChannel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...