첫 번째 일치 패턴 앞에만 새 행 삽입

첫 번째 일치 패턴 앞에만 새 행 삽입

내 입력 파일에는 다음 데이터가 포함되어 있습니다.

acb/xyz/row<t>
acb/xyz/row<t>
abc/xyz/row<b>
abc/xyz/row<b>
abc/xyz/row<0>
abc/xyz/row<0>
abc/xyz/row<1>
abc/xyz/row<1>
abc/xyz/row<2>
abc/xyz/row<2>
abc/xyz/row<3>
abc/xyz/row<3>
abc/xyz/row<4>
abc/xyz/row<4>

그래서 출력이 다음과 같기를 원합니다.

#Sector Top
acb/xyz/row<t>
acb/xyz/row<t>
#Sector Bottom
abc/xyz/row<b>
abc/xyz/row<b>
#Sector 0
abc/xyz/row<0>
abc/xyz/row<0>
#Sector 1
abc/xyz/row<1>
abc/xyz/row<1>
#Sector 2
abc/xyz/row<2>
abc/xyz/row<2>
#Sector 3
abc/xyz/row<3>
abc/xyz/row<3>
#Sector 4
abc/xyz/row<4>
abc/xyz/row<4>
  • 위에 표시된 각 섹터에는 여러 줄이 포함되어 있습니다. 여기서는 섹터당 2줄만 표시합니다.
  • 상단, 하단 및 0부터 30까지의 섹터가 있습니다. 여기서는 최대 4개의 섹터를 표시합니다.

섹터 중 하나를 가져오기 위해 sed 명령을 사용해 보았습니다.

sed '/row<1>/i #Sector 1' myfile

이것은 나에게 다음과 같은 결과를 제공합니다.

#Sector 1
abc/xyz/row<1>
#Sector 1
abc/xyz/row<1>

모든 게임 전에 줄 바꿈이 필요하지 않으며 모든 섹션의 첫 번째 게임 전에 줄 바꿈만 하면 됩니다.

답변1

awk를 사용하십시오.

$ cat tst.awk
BEGIN {
    FS = "[<>]"
    map["t"] = "Top"
    map["b"] = "Bottom"
}
{
    sector = $(NF-1)
    if ( sector != prev ) {
        print "#Sector", (sector in map ? map[sector] : sector)
        prev = sector
    }
    print
}

$ awk -f tst.awk file
#Sector Top
acb/xyz/row<t>
acb/xyz/row<t>
#Sector Bottom
abc/xyz/row<b>
abc/xyz/row<b>
#Sector 0
abc/xyz/row<0>
abc/xyz/row<0>
#Sector 1
abc/xyz/row<1>
abc/xyz/row<1>
#Sector 2
abc/xyz/row<2>
abc/xyz/row<2>
#Sector 3
abc/xyz/row<3>
abc/xyz/row<3>
#Sector 4
abc/xyz/row<4>
abc/xyz/row<4>

답변2

N;P;D루프를 사용하여 이 작업을 수행하고 sed행 번호가 변경된 경우에만 행을 삽입할 수 있습니다.#Sector

sed -E 'N;P;/^(.*)\n\1/D;s/.*(\n.*)(row<)([0-9bt])*>/#Sector \3\1\2\3>/;P;D'

이제 다음과 같이 top및 부분 에 대한 처리를 추가해야 합니다 .bottom

sed -E -e '1i #Sector top' -e 'N;P;/^(.*)\n\1/D;s/.*(\n.*)(row<)([0-9bt])*>/#Sector \3\1\2\3>/;s/#Sector b/&ottom/;P;D'

상해:

  • 옵션은 -E출력을 더 읽기 쉽게 만드는 것입니다. 대신 (…)이러한 부분에 8개의 백슬래시를 추가 할 수도 있습니다.
  • 1i #Sector top첫 번째 섹터 헤더만 추가하세요.
  • 이제 항상 두 줄을 함께 처리하고 첫 번째 줄을 인쇄하기 N위해 항상 확장 줄을 추가합니다.P
  • /^(.*)\n\1/는 첫 번째 줄에서 반복되는 표현이므로 섹션 헤더를 삽입할 이유가 없으므로 D첫 번째 줄을 삭제하고 두 번째 줄을 계속 진행합니다.
  • 이제 정규식 마술을 사용해보세요. 첫 번째 줄(이미 인쇄되었습니다!)을 s/.*(\n.*)(row<)([0-9bt])*>/#Sector \3\1\2\3>/섹션 제목과 ()세 번째 쌍에서 추출한 줄 번호 로 바꿉니다.
  • 마지막으로 간단히 b다음으로 변경하십시오.bottoms/#Sector b/&ottom/
  • PD첫 번째 줄을 인쇄하고 삭제하여 두 번째 줄을 계속 진행하여 루프를 닫습니다.

답변3

GNU 사용sed

$ sed -Ez 's/(\S+row<([^>]*)>)(.*\1)?/#Sector \2\n&/g;s/\<t\>/Top/;s/\<b\>/Bottom/' input_file
#Sector Top
acb/xyz/row<t>
acb/xyz/row<t>
#Sector Bottom
abc/xyz/row<b>
abc/xyz/row<b>
#Sector 0
abc/xyz/row<0>
abc/xyz/row<0>
#Sector 1
abc/xyz/row<1>
abc/xyz/row<1>
#Sector 2
abc/xyz/row<2>
abc/xyz/row<2>
#Sector 3
abc/xyz/row<3>
abc/xyz/row<3>
#Sector 4
abc/xyz/row<4>
abc/xyz/row<4>

답변4

다음 스크립트는 bash 쉘에서 실행됩니다.

#!/bin/bash
awk 'BEGIN{ FS="/" }
{a=$3;
    if(a != b)
        print "Sector " substr(a,5,1)"\n" a
    else
        print a;
    b=$3}' myfile.txt

관련 정보