
Meine Eingabedatendatei sieht folgendermaßen aus
Town,Code1,Code2,Code3,Code4
Oxford,X532,X011,X989
Oxford,X532,X011
Hendon,X002,X011,X222,X769
Ich brauche die Ausgabe, um die Städte mit dem zugehörigen Code aufzulisten, wie folgt
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
Ich brauche es jedoch auch, um zusammenzufassen, wo die Codes erscheinen, die an derselben Position erscheinen, so dass das Obige eher so aussehen würde
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
Derzeit erfüllt das von mir geschriebene AWK die meisten meiner Anforderungen, aber ich muss natürlich ein Array erstellen, um zu speichern, wo die gleichen Codes an der gleichen Position für die Anzahl in der Ausgabe vorhanden sind - mein AWK ist in seiner jetzigen Form
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}
}
}
Wie kann ich dieses AWK beenden, um die richtige Ausgabe zu erzeugen? Ich bin nicht sicher, ob ich einen END-Abschnitt usw. brauche.
Antwort1
Versuche dies,
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
Um zusammenzufassen, wo die Codes, die an der gleichen Position erscheinen
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
Antwort2
Ich würde die Eingabedatei zweimal verarbeiten: einmal, um die Vorkommen von Orts-Code-Paaren zu zählen, einmal, um den Bericht auszugeben:
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
Antwort3
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]}
}
Ergebnisse:
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