使用AWK将多行文本转换为CSV

使用AWK将多行文本转换为CSV,csv,awk,gawk,Csv,Awk,Gawk,我有这样一个文件: // question: 0 name: Switch category to $cat1$/Pretest Durchführung MIT 04//05/IKT_1_PT/IKT_1_PT_2_MIT05 $CATEGORY: $cat1$/Pretest Durchführung MIT 04//05/IKT_1_PT/IKT_1_PT_2_MIT05 // question: 164887 name: PT_IKT_1_01_ FTP ::PT_IKT_1_0

我有这样一个文件:

// question: 0  name: Switch category to $cat1$/Pretest Durchführung MIT 04//05/IKT_1_PT/IKT_1_PT_2_MIT05
$CATEGORY: $cat1$/Pretest Durchführung MIT 04//05/IKT_1_PT/IKT_1_PT_2_MIT05


// question: 164887  name: PT_IKT_1_01_ FTP
::PT_IKT_1_01_ FTP::Wozu dient das FTP Protokoll?{
    ~%-100%Blah1
    ~%-100%Blah2
    =Blah3
    ~%-100%Blhah4.
}


// question: 164888  name: PT_IKT_1_02_Verteilte_Systeme
::PT_IKT_1_02_Verteilte_Systeme::Question2?{
    ~%-100%A1
    ~%-100%A2
    =A3
    ~%-100%A4
}

// question: 164893  name: PT_IKT_1_07_Rational_Unified_Process
::PT_IKT_1_07_Rational_Unified_Process::Question3?{
    ~%-50%A1
    ~%-50%A2
    ~%50%A3
    ~%50%A4
}
awk -v RS="" -F"\n" '$2~/^::/ {sub(/::/,"",$2);sub(/::/,";",$2);sub(/{/,"",$2);for(i=3;i<=6;i++) {n=split($i,a,"[%=]");m=m";"a[n]";"(i==5?"T":"F")};print $2 m;m=""}' file
PT_IKT_1_01_ FTP;Wozu dient das FTP Protokoll?;Blah1;F;Blah2;F;Blah3;T;Blhah4.;F
PT_IKT_1_02_Verteilte_Systeme;Question2?;A1;F;A2;F;A3;T;A4;F
PT_IKT_1_07_Rational_Unified_Process;Question3?;A1;F;A2;F;A3;T;A4;F
如何使用AWK创建这样的输出

PT_IKT_1_01_ FTP;Wozu dient das FTP Protokoll?;Blah1;F;Blah2;F;Blah3;T;Blhah4.;F
PT_IKT_1_02_Verteilte_Systeme;Question2?;A1;F;A2;F;A3;T;A4;F
PT_IKT_1_07_Rational_Unified_Process;Question3?;A1;F;A2;F;A3;T;A4;T
答案前面的So-表示错误答案,=表示答案为真。但是,在某些行中,只有一个答案为真,在这种情况下,没有数字表示有多少百分比的答案为真或假


输入文件是礼品文件格式规范的子集,您可以执行以下操作:

// question: 0  name: Switch category to $cat1$/Pretest Durchführung MIT 04//05/IKT_1_PT/IKT_1_PT_2_MIT05
$CATEGORY: $cat1$/Pretest Durchführung MIT 04//05/IKT_1_PT/IKT_1_PT_2_MIT05


// question: 164887  name: PT_IKT_1_01_ FTP
::PT_IKT_1_01_ FTP::Wozu dient das FTP Protokoll?{
    ~%-100%Blah1
    ~%-100%Blah2
    =Blah3
    ~%-100%Blhah4.
}


// question: 164888  name: PT_IKT_1_02_Verteilte_Systeme
::PT_IKT_1_02_Verteilte_Systeme::Question2?{
    ~%-100%A1
    ~%-100%A2
    =A3
    ~%-100%A4
}

// question: 164893  name: PT_IKT_1_07_Rational_Unified_Process
::PT_IKT_1_07_Rational_Unified_Process::Question3?{
    ~%-50%A1
    ~%-50%A2
    ~%50%A3
    ~%50%A4
}
awk -v RS="" -F"\n" '$2~/^::/ {sub(/::/,"",$2);sub(/::/,";",$2);sub(/{/,"",$2);for(i=3;i<=6;i++) {n=split($i,a,"[%=]");m=m";"a[n]";"(i==5?"T":"F")};print $2 m;m=""}' file
PT_IKT_1_01_ FTP;Wozu dient das FTP Protokoll?;Blah1;F;Blah2;F;Blah3;T;Blhah4.;F
PT_IKT_1_02_Verteilte_Systeme;Question2?;A1;F;A2;F;A3;T;A4;F
PT_IKT_1_07_Rational_Unified_Process;Question3?;A1;F;A2;F;A3;T;A4;F

为什么不使用礼品解析器呢?这样:
NF-1
可能比这里的
6
好。另外,我认为T/F决策希望类似于
$I~/^=/| | a[2]!~/^-/
@EtanReisner,我同意改为
NF-1
可能是个好主意,因为如果OP需要,它将覆盖无限的字段。@EtanReisner否,示例是正确的。=是正确答案,-表示错误答案。因此,在最后一个示例中,有两个正确答案。无论如何,这个建议是脆弱的。我对(g)awk不是很流利,但使用eg RS=“/”的解决方案不是更好吗?@JohnDoe根据链接文档,领先的
=
和缺乏
-
都是正确答案,后者是部分学分。这也是示例输出中的T/F标记映射到的内容。如前所述,这并不会产生这样的结果。空
RS
表示在空行上拆分。