次のパターンで、多くのデータを含む入力ファイルがあります。一部のデータは次のとおりです。
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;