2017-01-31 3 views
0

Что касается этой команды, которая делает работу:Можно ли изменить эту команду AWK, чтобы не только распечатать совпадение, но и удалить совпадение?

awk ' 
    /Start/{f=1;rec=""} 
    f{rec=rec $0 ORS} 
    /End/{if (rec~/middle/) printf "%s",rec} 
' original-file.txt > new-file-with-match.txt 

Как этот сценарий будет изменен на:

  1. печати & вывода матч в новом-файл-с-match.txt (это теперь работает)
  2. удалить матч в оригинальном-file.txt

STEP1 (?): оригинал-е ile.txt

 
blah1234 
Start 
blah.. 
blah.. 
middle 
blah... 
End 
blah5324 

STEP2: новый-файл-с match.txt

 
Start 
blah..blah 
blah.. 
middle 
blah... 
End 

STEP3: оригинал-file.txt (заключительный этап)

 
blah1234 
blah5324 

Могло ли это сделать проще с SED?

+2

Префикс вашего кода с четырьмя пробелами. Пожалуйста, взгляните на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+1

[изменить] ваш вопрос, чтобы включить краткий, проверяемый ввод образца и ожидаемый результат, правильно отформатированный кнопкой '{}'. sed для простых подстановок на отдельных линиях, вот и все. То, что вы пытаетесь сделать, - это не простая замена на отдельные строки, и поэтому это не работа для sed. Похоже, это будет просто с awk, но пока вы не предоставите недостающую информацию, которую трудно сказать. –

ответ

1
$ cat tst.awk 
/Start/ { f=1; rec="" } 
f { 
    rec=rec $0 ORS 
    if (/End/) { 
     if (rec~/middle/) { 
      printf "%s",rec > "newFile.txt" 
     } 
     else { 
      printf "%s", rec 
     } 
     f = 0 
    } 
    next 
} 
{ print } 

$ awk -f tst.awk file 
blah1234 
blah5324 

$ cat newFile.txt 
Start 
blah.. 
blah.. 
middle 
blah... 
End 

Просто измените вызов выше awk -f tst.awk file > tmp && mv tmp file или добавить -i infile для INPLACE редактирования, если вы используете GNU AWK.

+0

Не удалось сопоставить это с моим примером. попробовал пример, но результаты не то, что я ожидал –

+1

Плохо, вы правы, ваш пример действительно работает. Я не должен был изменять его, помещая внутри цикла bash for и пытаюсь изменить «newFile.txt» на переменную, используемую в цикле for. Извините, спасибо, за ваш пример, я думаю, я немного исказил его , пытаясь работать в цикле for. –

+1

'^ 1' Очень элегантный –

0

Вы можете использовать awk.

Дано:

$ cat f1.txt 
blah1234 
Start 
blah.. 
blah.. 
middle 
blah... 
End 
blah5324 

Вы можете сделать:

$ awk 'NR==FNR && /^Start/,/^End/ {print} 
     NR==FNR     {next} 
     !f1      {f1=1; print "========="} 
     /^Start/,/^End/ {next} 1' f1.txt f1.txt | awk 'BEGIN{fout="f2.txt"} 
     /^=========/ {fout="f1.txt"; next} {print >fout}' 

$ cat f1.txt 
blah1234 
blah5324 
$ cat f2.txt 
Start 
blah.. 
blah.. 
middle 
blah... 
End 
+0

Я вижу начало и конец, но не «средний», средний необходим, потому что он гарантирует, что выбран правильный начальный/конечный блок. –

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