我的输入数据文件如下所示
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