2 Stimmen

Übersetzen Sie die Liste ins Tabellenformat (awk)

Ich möchte eine Liste mit den Wochentagen und den dazugehörigen Zeiten in ein tabellenähnliches Format umwandeln.

Unten findest du die Eingabe:

Mon 0100
Mon 0700
Tue 0700
Wen 0100
Wen 0700
Thu 0100
Thu 0700
Fri 0100
Fri 0700
Sat 0100
Sun 0100
Sun 0700

Unten siehst du das Ergebnis:

        Mon  Die  Mit  Don  Fre  Sam  Son   
0100    X         X    X    X    X    X   
0700    X    X    X    X    X         X    

Ich suche vorzugsweise Antworten in awk. Die Beibehaltung des Formats im gegebenen Ergebnis wird bevorzugt. In dem Fall, dass ein Wochentag fehlt, sollte er nicht aufgeführt werden (falls möglich, wäre es schön, auch die Antwort zu haben, die den fehlenden Wochentag im Ergebnis enthält, wenn er nicht in der Eingabe vorhanden ist).

Ich habe es versucht, aber abgesehen davon, dass ich die erste Zeile ausgeben kann, kann ich mir wirklich keinen Reim auf die Konstruktion der Arrays machen, obwohl ich mir vorstelle, dass es relativ einfach ist.

Danke Ell

5voto

jaypal singh Punkte 70917

Hier ist eine Möglichkeit, awk zu verwenden:

awk '
!($1 in day) { days[++d] = $1; day[$1]++ }
!($2 in num) { nums[++n] = $2; num[$2]++ }
             { map[$1,$2]++ }
END {
    printf "\t"
    for (i=1; i<=d; i++) {
        printf "\t%s", days[i]
    }
    print ""
    for (j=1; j<=n; j++) {
        printf "%s ", nums[j]
        for (i=1; i<=d; i++) {
            printf "\t%s", (map[days[i],nums[j]] ? "X" : FS )
        }
        print ""
    }
}' file

Ausgabe:

        Mon Die Mit Don Fre Sam Son
0100    X       X   X   X   X   X
0700    X   X   X   X   X       X

1voto

Sean Bright Punkte 114347

Ich bin mir sicher, dass es eine viel elegantere Lösung gibt (ich kenne awk nicht wirklich - ich gehe nur nach dem gawk-Handbuch):

BEGIN {
        days["Mon"] = 1      
        days["Tue"] = 2      
        days["Wen"] = 4      
        days["Thu"] = 8      
        days["Fri"] = 16      
        days["Sat"] = 32      
        days["Sun"] = 64      
}

{
        hours[$2] = or(hours[$2], days[$1])
}

END {
        print "        Mon  Tue  Wed  Thu  Fri  Sat  Sun"

        for (key in hours) {
                printf "%s    ", key
                for (i = 0; i < 7; i++) {
                        if (and(hours[key], 2 ** i))
                                printf "X"
                        else
                                printf " "
                        printf "    "
                }
                print ""
        }
}

Beachten Sie, dass in Ihrer Beispieleingabedatei Mittwoch als "Wen" angegeben ist, in Ihrer Ausgabe jedoch als "Wed." Wenn sich in der Beispieleingabedatei ein Schreibfehler befindet, müssen Sie Zeile 4 des obigen Skripts entsprechend anpassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X