내 입력 파일에는 다음 데이터가 포함되어 있습니다.
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
다음으로 변경하십시오.bottom
s/#Sector b/&ottom/
P
D
첫 번째 줄을 인쇄하고 삭제하여 두 번째 줄을 계속 진행하여 루프를 닫습니다.
답변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