awk를 사용하여 줄 병합

awk를 사용하여 줄 병합

다음 패턴으로 많은 데이터가 포함된 입력 파일이 있습니다. 일부 데이터는 다음과 같습니다.

Data1 
C
In;
CP
In;
D
In;
Q
Out;
Data2 
CP
In;
D
In;
Q
Out;
Data3 
CP
In;
CPN
In;
D
In;
QN
Out;

내 출력이

Data1(C,CP,D,Q)
In C;
In CP;
In D;
Out Q;
Data2 (CP,D,Q)
In CP;
In D;
Out Q;
Data3 (CP,CPN,D,QN)
In CP;
In CPN;
In D;
Out QN;

어떻게 해야 하나요?

답변1

$ cat tst.awk
BEGIN { FS="[[:space:];]+" }
{ rec[++nf] = $1 }
$1 == "Out" {
    printf "%s(", rec[1]
    for (i=2; i<=nf; i+=2) {
        printf "%s%s", (i>2 ? "," : ""), rec[i]
    }
    print ")"

    for (i=2; i<=nf; i+=2) {
        print rec[i+1], rec[i] ";"
    }

    delete rec
    nf = 0
}

$ awk -f tst.awk file
Data1(C,CP,D,Q)
In C;
In CP;
In D;
Out Q;
Data2(CP,D,Q)
In CP;
In D;
Out Q;
Data3(CP,CPN,D,QN)
In CP;
In CPN;
In D;
Out QN;

답변2

이 시도...

awk 'BEGIN {RS="\n\n";} {for(i=1;i<=NF;i++) if ($i ~ "Data") print $i; else if ($i ~ "In;") print "In " $(i-1)";" ; else if ($i ~ "Out") print "Out " $(i-1)";"}'  a.txt

답변3

GNU sed확장 정규식 패턴 호출을 사용하면 -E표시된 대로 포트와 해당 유형을 인쇄할 수 있습니다. 자세한 내용은. 매뉴얼 페이지(man sed) 또는 Gnu sed 매뉴얼(info sed)을 찾을 수 있습니다.

$ sed -Ee '
  /\n/{
    /\n.*\n/{P;D;}
    p;$d;g
  }
  :loop
    $break;N
  /;(\n[^;]+){2}$/!bloop
  :reak
  h;s/;[^;]+$/;/
  s/\n[^\n;]+;//g
  s/\n/(/;y/\n/,/;s/$/)/p
  g;s/.*;\n//
  x;s/;[^;]+$/;/
  s/\n([^\n]+)(\n[^\n;]+)/\2 \1/g
  D
' file

결과:

Data1 (C,CP,D,Q)
In C;
In CP;
In D;
Out Q;
Data2 (CP,D,Q)
In CP;
In D;
Out Q;
Data3 (CP,CPN,D,QN)
In CP;
In CPN;
In D;
Out QN;

답변4

gawk '
    BEGIN { FS = "\n"; RS = ";\n" }
    function output() {
        print data ")"
        for (i=1; i<=c; i++) print inout[i]
        delete inout
        c=0
    }
    NF == 3 {
        if (NR > 1) output()
        data = $1 "(" $2
        inout[++c] = $3 " " $2 ";"
    }
    NF == 2 {
        data = data "," $1
        inout[++c] = $2 " " $1 ";"
    }
    END {output()}
' file
Data1 (C,CP,D,Q)
In C;
In CP;
In D;
Out Q;
Data2 (CP,D,Q)
In CP;
In D;
Out Q;
Data3 (CP,CPN,D,QN)
In CP;
In CPN;
In D;
Out QN;

관련 정보