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'