2013-04-20 3 views
2

У меня есть огромный текстовый файл, каждая строка которого содержит строку с рисунком FEATURE_ . Я хочу прочитать каждую строку из этого txt-файла и удалить все остальные строки из файла, которые содержат одну строку FEATURE_.Хотите прочитать строки из txt-файла и удалить другие строки, содержащие одну и ту же подстроку

Пожалуйста, предложите DOS и перл ЦМД, чтобы сделать этот

, например

Вход:

#ifdef FEATURE_ABCD 
#ifdef FEATURE_GHDI 
#ifdef FEATURE_ABCD 
#ifdef FEATURE_WXYZ 
#ifdef FEATURE_ABCD 
#ifdef FEATURE_WXYZ 
#ifdef FEATURE_GHDI 
#ifdef FEATUREGHDI 
#define FEATURE_ABCD 
#define FEATUREGHDI 
/* FEATURE_GHDI */ 

Выход:

#ifdef FEATURE_ABCD 
#ifdef FEATURE_GHDI 
#ifdef FEATURE_WXYZ 
#ifdef FEATUREGHDI 
+0

Ваш пример неправильный. Выходной файл должен содержать '#define FEATUREGHDI', потому что он НЕ содержит« FEATURE_ ». Не так ли? – Aacini

ответ

2

Предполагая, что ваш текстовый файл FEATURE.TXT, попробуйте это :

@ECHO OFF & setlocal enabledelayedexpansion 
for /f "delims=" %%i in (FEATURE.TXT) do (
    set "line0=%%i" 
    set "line=!line0:*FEATURE=!" 
    if not "!line0!"=="!line!" (
     for /f %%j in ("!line!") do set "line=%%j" 
     if not defined $a!line! (
      set "$a!line!=!line!" 
      (echo(!line0!) 
     ) 
    ) 
) 

Вы можете перенаправить вывод в файл, если вы положили >>OUTPUT.TXT после команды (echo(!line0!).

Выход:

#ifdef FEATURE_ABCD 
#ifdef FEATURE_GHDI 
#ifdef FEATURE_WXYZ 
#ifdef FEATUREGHDI 

Edit: некоторые улучшения, чтобы ускорить код.

1
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /f "delims==" %%i IN ('set found 2^>nul') DO SET "%%i=" 
SET found=FEATURE_ 
SET /a count=0 
(
FOR /f "delims=" %%i IN ('findstr /n "$" ^<feature.txt') DO (
SET feature=%%i 
SET line=!feature:*:=! 
IF DEFINED line (
    SET feature=!line:*FEATURE_=! 
    IF "!line!"=="!feature!" (ECHO(!line!) ELSE (
    FOR /f %%f IN ("!feature!") DO SET feature=%%f&SET found|FINDSTR /e "=%%f" >NUL 
    IF ERRORLEVEL 1 (
    ECHO(!line! 
    SET found!count!=!feature! 
    SET /a count+=1 
    ) 
) 
) ELSE (ECHO() 
) 
) >newfile.txt 

для каждой линии, в том числе пустых строк,

  • номер линия, затем убираются номер Генерирования пустой строки, если оригинал был пуст
  • иначе, содержит ли строка целевого текста , echo if not
  • В противном случае проверьте, была ли найдена строка после цели.
  • если нет, то сгенерировать строку и записать новый целевой суффикс в foundcounter

НО

Futher на комментарий Aacin, а может быть, вы должны сесть с хорошей чашкой горячего чая и думать о том, что вы действительно хотите здесь.

Если вы делаете, как вы сказали, то последовательность

#ifdef FEATURE_ABCD 
something 
endif 

или

#ifdef FEATURE_ABCD something 

, скорее всего, производить что-то вы действительно не хотите - и как насчет

#ifdef FEATURE_ABCD 
... 
#define FEATURE_ABCD 
... 
#ifdef FEATURE_ABCD 

??

0

Наименьший код и funcional:

@echo OFF 

Set "File=Input.txt" 
Set "OutputFile=Output.txt" 

For /F "Usebackq Tokens=2,* delims= " %%# in ("%File%") Do (
    Echo "%%#" | Find /I "Feature_" 1>NUL && (
     (Type "Features.txt" | FIND /I "%%#" 1>NUL) || (Echo %%#>>"%OutputFile%"))) 

Кодовые ommits линии без «Feature_» строка, если нашли правильную строку, то находит внутри выходного файла, чтобы увидеть, если строка уже существует, чтобы добавить или ommit Струна.

Испытан с вводом текстом, получил правильный вывод:

#ifdef FEATURE_ABCD 
#ifdef FEATURE_GHDI 
#ifdef FEATURE_WXYZ 
+0

Это, очевидно, не работает. – Endoro

0

Есть несколько способов решения этой проблемы, каждый со своими характеристиками. Самые быстрые решения выполняют минимальное количество команд в каждой строке входного файла, избегая, в частности, внешних команд. Пакетный файл, приведенный ниже, предназначен для быстрой обработки огромного текстового файла со многими соответствующими строками. Сначала метод создает вспомогательный файл с номерами строк для удаления (с использованием команды FINDSTR), затем выполните слияние с процессом с этим файлом и оригинальным.

@echo off 
setlocal EnableDelayedExpansion 

set string=FEATURE_ 

rem Run FINDSTR to find the lines with the target string and store the numbers of the lines that will be deleted 
(for /F "tokens=1* delims=:" %%a in ('findstr /N "%string%" inputFile.txt') do (
    set "line=%%b" 
    for /F %%c in ("!line:*%string%=!") do (
     rem If this is the first line with the target string 
     if not defined string[%%c] (
     rem Define the target string (and preserve this line) 
     set string[%%c]=0 
    ) else (
     rem Mark this line for deletion 
     echo %%a 
    ) 
    ) 
)) > linesToDelete.txt 
rem Insert the EndOfFile mark 
echo 0 >> linesToDelete.txt 

rem Merge numbers of lines to delete (from STDIN) and input file (from FOR command) 
< linesToDelete.txt (
    set /P lineToDelete= 
    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" inputFile.txt') do (
     if %%a neq !lineToDelete! (
     rem Preserve this line 
     echo(%%b 
    ) else (
     rem Ignore this line and pass to next one to delete 
     set /P lineToDelete= 
    ) 
    ) 
) > outputFile.txt 

del linesToDelete.txt 

Эта пакетная программа не завершена, если входной файл содержит специальные символы Batch, как ! < | > &. Это ограничение может быть исправлено, если это необходимо.

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