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

时间:2014-08-26 09:22:00

标签: 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_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创建这样的输出?

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

所以 - 在答案文本前面表示错误的答案,并且=表示答案是真的。但是,有些行只有一个答案是真的,在这种情况下,没有数字表明有多少答案是真的或者是假的。

输入文件是https://docs.moodle.org/23/en/GIFT_format

的GIFT文件格式规范的子集

1 个答案:

答案 0 :(得分:1)

你可以这样做:

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

PS,我不确定你是如何得到那些FT的。我确实假设F;F;T;F,但您有一个F;F;T;T

更具可读性:

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