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

관련 정보