
내 입력 데이터 파일은 다음과 같습니다
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