누락된 단어가 있는 파일에 줄 추가

누락된 단어가 있는 파일에 줄 추가

xyz.txt다음과 같은 세 줄이 포함된 파일이 있습니다 .

I am ok.
I am fine.
all good.

am해당 행을 포함하지 않는 행을 찾아 이전 행에 추가해야 합니다.

주어진 예에서 필요한 출력은 다음과 같습니다.

I am ok.
I am fine. all good.

그리고 스크립트는 대용량 파일에서도 작동해야 합니다. 예를 들어, 파일에 10개의 라인이 있고 라인 3과 7에 "am"이 누락된 경우 라인 3은 라인 2에 추가되고 라인 7은 라인 6에 추가되어야 합니다.

답변1

해결책( 단어 경계 연산자 awk에 GNU 또는 busybox가 사용된다고 가정 ):\<\>

확장된 샘플 file:

I am ok.
I am fine.
all good.
am I sleeping?
how's that
I am sure
about that
and think on.
For that I am now

awk '{ printf "%s%s",(NR==1? "": (!/\<am\>/? OFS:ORS)),$0 }END{ print "" }' file
  • "%s%s"- 2가지 사양의 형식 문자열입니다. 첫 번째는 %s잠재적인 항목 "선행" 구분 기호입니다.
    • 첫 번째 레코드( )의 경우 (빈 문자열) NR==1입니다 .""
    • 단어가 포함되지 않은 레코드 의 경우 am- OFS(출력 필드 구분 기호, 즉 공백)
    • am-라는 단어가 포함된 레코드 의 경우 ORS(기본 개행 문자인 출력 레코드 구분 기호)

산출:

I am ok.
I am fine. all good.
am I sleeping? how's that
I am sure about that and think on.
For that I am now

답변2

그리고 sed:

sed -e ':a' -e 'N;/\n.*am/!s/\n/ /;ta' -e 'P;D'

설명하다:

  • 다음 줄 추가 N(또는 마지막 줄과 끝 인쇄)
  • am두 번째 줄에 (후행 !음수 주소 패턴 ) 이 포함되어 있지 않으면 \n.*am개행 문자를 공백으로 바꿉니다.
  • 이 교체가 수행되면 필요한 경우 처음으로 반복하여 다른 줄을 추가합니다( ta표시로의 조건부 점프입니다 :a).
  • 두 번째 줄에 am(교체 없음)이 포함되어 있으면 P;D첫 번째 줄을 인쇄하고 두 번째 줄부터 시작합니다.

이해합니다. 당신은 리눅스를 사용하는 것 같습니다. GNU를 사용하면 sed간단하게 작성할 수 있습니다.

sed ':a;N;/\n.*am/!s/\n/ /;ta;P;D'

관련 정보