AWK - 使用两个文件

时间:2016-05-11 12:12:40

标签: awk

我有这两个csv文件:

档案A:

veículo;carro;sust
automóvel;carro;sust
viatura;carro;sust
breve;rápido;adj
excepcional;excelente;adj
maravilhoso;excelente;adj
amistoso;simpático;adj
amigável;simpático;adj
...

档案B:

"A001","carro","sust","excelente","adj","ocorrer","adv","bom","adj"
...

在文件A中,$ 1(单词)是$ 2(单词)和$ 3(单词)的同义词。

在文件B的行中,我们可以跳过$ 1,剩下的列是单词及其词性。

我需要做的是逐行查看文件A中的每对(word-pos),并为每个同义词生成一行。这很难解释。

期望的输出:

"A001","carro","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","viatura","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","veículo","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","automóvel","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","carro","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","viatura","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","veículo","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","automóvel","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","carro","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","viatura","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","veículo","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","automóvel","sust","maravilhoso","adj","ocorrer","adv","bom","adj"

完成:

BEGIN {
    FS="[,;]";
    OFS=";";
}
FNR==NR{
    sinonim[$1","$2","$3]++;
    next;
}
{

    s1=split($0,AX,"\n");
    for (i=1;i<=s1;i++)
    {
        s2=split(AX[i],BX,",");
        for (j=2;j<=NF;j+=2)
        {
            lineX=BX[j]","BX[j+1];
            gsub(/\"/,"",lineX);
            for (item in sinonim)
            {
                s3=split(item,CX,",");
                lineS=CX[2]","CX[3];
                if (lineX == lineS)
                {
                    BX[j]=CX[1];
                    lineD=""
                    for (t=1;t<=s2;t++)
                    {
                        lineD=lineD BX[t]",";
                    }
                    lineF=lineF lineD"\n";
                }
            }
        }
    }
    print lineF

}

2 个答案:

答案 0 :(得分:0)

BEGIN { FS="[,;]"; OFS="," }
NR == FNR { key = "\"" $2 "\""; synonym[key] = synonym[key] "," $1; next }
{
    print;
    if ($2 in synonym) {
        count = split(substr(synonym[$2], 2), choices)
        for (i = 1; i <= count; i++) {
            $2 = "\"" choices[i] "\""
            print
        }
    }
}

答案 1 :(得分:0)

$ cat tst.awk
BEGIN   { FS=";" }
NR==FNR { synonyms[$2,$3][$2]; synonyms[$2,$3][$1]; next }
FNR==1  { FS=OFS="\",\""; $0=$0 }
{
    gsub(/^"|"$/,"")
    for (i=2;i<NF;i+=2) {
        if ( ($i,$(i+1)) in synonyms) {
            for (synonym in synonyms[$i,$(i+1)]) {
                $i = synonym
                for (j=2;j<NF;j+=2) {
                    if ( ($j,$(j+1)) in synonyms) {
                        for (synonym in synonyms[$j,$(j+1)]) {
                            orig = $0
                            $j = synonym
                            if (!seen[$0]++) {
                                print "\"" $0 "\""
                            }
                            $0 = orig
                        }
                    }
                }
            }
        }
    }
}

$ awk -f tst.awk fileA fileB
"A001","carro","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","veículo","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","automóvel","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","viatura","sust","excelente","adj","ocorrer","adv","bom","adj"
"A001","carro","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","carro","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","veículo","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","veículo","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","automóvel","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","automóvel","sust","excepcional","adj","ocorrer","adv","bom","adj"
"A001","viatura","sust","maravilhoso","adj","ocorrer","adv","bom","adj"
"A001","viatura","sust","excepcional","adj","ocorrer","adv","bom","adj"

以上使用GNU awk进行多维数组,其他awks使用synonyms[$2,$3] = synonyms[$2,$3] " " $2等等进行简单的调整,然后使用split()代替synonyms[$2,$3][$2]和{{ 1}}。