AWK 和数组 - 更具体的示例

AWK 和数组 - 更具体的示例

我的输入数据文件如下所示

Town,Code1,Code2,Code3,Code4
Oxford,X532,X011,X989
Oxford,X532,X011
Hendon,X002,X011,X222,X769

我需要输出列出带有相关代码的城镇,如下所示

Oxford,X532,1,Prim
Oxford,X011,2,Secd
Oxford,X989,3,Secd
Oxford,X532,1,Prim
Oxford,X001,2,Secd
Hendon,X002,1,Prim
Hendon,X011,2,Secd
Hendon,X222,3,Secd
Hendon,X769,4,Secd

但是,我还需要它来总结出现在同一位置的代码,因此上面看起来更像这样

Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X001,2,Secd,1
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,1
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1

目前,我编写的 AWK 可以完成我想要的大部分功能,但显然,我需要创建一个数组来存储输出中计数的相同位置中存在相同代码的位置 - 我的 AWK 是

FS=","
OFS=","
}
{ 

site=$1
code[1]=$2
code[2]=$3
code[3]=$4
code[4]=$5

key=site

for (i=1; i<=4; ++i)    {
        cnt=i
        ++recs[i]
        posn=""
        if (cnt==1)     {posn="Prim"}
        else            {posn="Secd"}

        if (code[i] !="")       {print key,code[i], cnt, posn}
                        }

}

我怎样才能完成这个 AWK,以产生正确的输出?不确定我是否需要 END 部分等。

答案1

尝试这个,

awk -F ',' '{for (i=2;i<=NF;i++) { if (i==2) {print $1","$i","i-1",""Prim"}  else print $1","$i","i-1",""Secd"}}' file
Oxford,X532,1,Prim
Oxford,X011,2,Secd
Oxford,X989,3,Secd
Oxford,X532,1,Prim
Oxford,X001,2,Secd
Hendon,X002,1,Prim
Hendon,X011,2,Secd
Hendon,X222,3,Secd
Hendon,X769,4,Secd

总结一下出现在同一位置的代码

ARRAY=(`awk -F ',' '{for (i=2;i<=NF;i++) { if (i==2) {print $1","$i","i-1",""Prim"}  else print $1","$i","i-1",""Secd"}}' file`)
for i in ${ARRAY[@]}
do
    PATTERN=`echo $i | awk -F ',' '{print $2}'`
    COUNT=`echo "${ARRAY[@]}"| tr ' ' '\n' | grep -c $PATTERN `
    echo "$i,$COUNT"
done

Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X001,2,Secd,1
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,2
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1

答案2

我将处理输入文件两次:一次用于计算城镇+代码对的出现次数,一次用于输出报告:

awk -F, -v OFS=, '
    FNR == 1 {next}
    NR == FNR {
        for (i=2; i <= NF; i++)
            count[$1,$i]++
        next
    }
    {
        for (i=2; i <= NF; i++)
            print $1, \
                  $i, \
                  (i-1), \
                  (i == 2 ? "Prim" : "Secd"), \
                  count[$1,$i]
    }
' file file
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,1
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1

答案3

BEGIN { 
    FS=","
    OFS=","
}
{
    site=$1
    code[1]=$2
    code[2]=$3
    code[3]=$4
    code[4]=$5    
    key=site

    for (i=1; i<=4; ++i)    {

        cnt=i
        ++recs[i]
        posn=""
        if (cnt==1)     {posn="Prim"}
        else            {posn="Secd"}

        if (code[i] !="")       { myarr[key","code[i]"," posn]++}
                        }
}
END{
    for (i in myarr) {print i","myarr[i]}
}

结果:

Hendon,X002,Prim,1
Hendon,X769,Secd,1
Oxford,X011,Secd,2
Hendon,X222,Secd,1
Oxford,X532,Prim,2
Hendon,X011,Secd,1
Oxford,X989,Secd,1

相关内容