다음과 같은 스키마가 있습니다.
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;