패턴의 첫 번째 부분을 잃지 않고 패턴을 찾을 때까지 여러 줄을 하나로 연결합니다.

패턴의 첫 번째 부분을 잃지 않고 패턴을 찾을 때까지 여러 줄을 하나로 연결합니다.

다음과 같은 스키마가 있습니다.

i-095erwr244r22cfeaa
TF-CLIENT
TF-StKML2
i-0c23232ac153534c5d
TF-CLIENT
TF-COMMON
TF-STEERR
i-043434e0934347eb5
TF-CLIENT
TF-ADFS
TF-COMMON
TF-STCLUSTER_1
TF-SwewCLUSTER3

나는 다음과 같은 출력을 원한다

i-095erwr244r22cfeaa,TF-COMMON;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3

나는 이것을 시도한다:

awk 'BEGIN{RS="i-"}NF>1{print substr(gensub(/\n/,";","g"),0,length($0)-0)}' sg1.txt

유사한 게시물을 기반으로 함여기 있어요나는 다음과 같은 결과를 얻습니다

095erwr244r22cfeaa;TF-COMMON;TF-StKML2;
0c23232ac153534c5d;TF-CLIENT;TF-COMMON;TF-STEERR;
043434e0934347eb5;TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3

따라서 "i-0" 패턴의 시작 부분을 자르고 모든 출력에 세미콜론을 추가합니다. 첫 번째 항목은 쉼표가 필요합니다. 사용해볼까 생각도 해봤는데sed결과에서 첫 번째 세미콜론을 바꾸십시오. 그런데 처음에 전체 출력을 어떻게 얻을 수 있습니까?

답변1

내 GNU sed제안 tr:

tr '\n' ';' < file | sed -E 's/(i-0[^;]*);/\n\1,/g'

산출:

i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3;

답변2

$ awk '/^i-/{if (NR>1) print rec; rec=$0 ","; next} {rec=rec $0 ";"} END{print rec}' file
i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3;

또는 각 줄 끝에 세미콜론을 원하는지 여부에 따라 다음을 수행합니다.

$ awk '/^i-/{if (NR>1) print rec; rec=$0; sep=","; next} {rec=rec sep $0; sep=";"} END{print rec}' file
i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3

답변3

당신은:

BEGIN { RS="i-" }
NF>1 {
    print substr( gensub(/\n/,";","g"), 0, length($0)-0)
}

여기서는 여러 행을 'i-'로 구분하여 즉시 손실되도록 하나의 레코드로 변환하고 NL("\n")을 ';'로 변환합니다. substr은 당신에게 별로 도움이 되지 않는 것 같습니다.

뿌리자체적으로 다시 적용하면 다음과 같이 귀하의 필요에 맞게 될 수 있습니다...

BEGIN { RS="i-" }
NF>1 {
    print gensub("^(.*);$", "i-\\1", "g", gensub(/\n/,";","g"))
}

이는 이전에 수행한 작업을 내부적으로 수행하고 여러 필드를 연결하고 NL을 ";"로 변환하는 gensub에 의존합니다. 외부에서는 단순히 이를 입력으로 받아들이고 "i-"를 처음에 다시 추가하고 끝에 있는 ";"을 자릅니다.

1번째 줄:

awk 'BEGIN{RS="i-"}NF>1{print gensub("^(.*);$", "i-\\1", "g", gensub(/\n/,";","g"))}' sg1.txt

작업을 수행하는 방법은 꽤 복잡합니다. 자신이 하고 있는 일을 다음과 같이 간단히 표현하는 것이 더 자연스럽습니다.

/^i-/ {
    if (line) print line;
    line=$0;
    next
}
{
    line = line";"$0
}
END {
    if (line) print line
}

^i-가 있는 줄을 보면 이전 상태를 인쇄하고 새 줄을 시작하세요. 나머지는 추가합니다. 헹구고 반복하십시오. 마지막에 인쇄하는 것을 잊지 마세요.

처음으로 테스트하고 인쇄합니다. 마지막으로 빈 파일이 나올 경우를 대비해 테스트하고 인쇄하세요.

답변4

터미널을 사용하여 각 레코드(줄)를 인쇄합니다 ;. 단, 줄이 a로 시작하지 않는 한, 이 경우 i-다음과 같이 인쇄됩니다.

$ awk -vORS=\; '/^i-/{printf "%s%s,",a,$0 ; a="\n";next}1;END{printf "\n"}' file

i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3;

관련 정보