키워드2가 없으면 키워드1 뒤의 줄을 삭제합니다.

키워드2가 없으면 키워드1 뒤의 줄을 삭제합니다.

"/test1/end" 뒤에 test1이 포함되지 않은 줄을 삭제하는 방법

test_long_sentence.txt:

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/theme="Halloween"
20  /test1/end=category
**This is some unwanted data blah blah blah**
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose
...

예상 출력:

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/theme="Halloween"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose
...

나는 시도했다:

grep -A1 'end' test_long_sentence.txt| sed 'test1/!d' test_long_sentence.txt > output.txt

답변1

노력하다:

$ awk '/test1/{f=0} !f{print}  /test1\/end/{f=1}' sentence.txt  
20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/theme="Halloween"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose

어떻게 작동하나요?

awk가 시작되면 정의되지 않은 모든 변수의 기본값은 false입니다. 따라서 awk가 시작되면 오류가 발생합니다 f. 그런 다음 awk는 각 줄을 차례로 읽고 다음 세 가지 명령을 실행합니다.

  • /test1/{f=0}

    포함된 모든 행에 대해 test1변수를 ffalse(0)로 설정합니다.

    인쇄할 줄 범위 내에 있으면 ffalse로 설정됩니다 .

  • !f{print}

    false 인 경우 f현재 줄을 인쇄합니다.

  • /test1\/end/{f=1}

    포함된 행에 대해 true(1)로 test1/end설정합니다 .f

    이는 포함하는 행에 도달할 때까지 후속 행을 인쇄해서는 안 된다는 것을 나타냅니다 test1.

변수 사용

awk -v a="test1" -v b="test1/end"  '$0~a{f=0} !f{print}  $0~b{f=1}' sentence.txt

관련 정보