Passen Sie die Spaltenüberschrift an und drucken Sie die Werte der Spalte mit awk


0

Ich habe Daten in der Datei in Spalten. Ich möchte ein Skript schreiben, das die Daten der Spalte anzeigt, die mit der Spaltenüberschrift übereinstimmen.

C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8 C-9
10  30  35  20  9   65  87  30  29
40  32  67  78  30  54  24  21  13
50  43  32  12  43  65  78  67  54

Wenn der Benutzer die C-8-Spalte anzeigt, muss die Ausgabe sein

C-8
30
21
67

Ich bin nicht sicher, wie ich den Spaltennamen zuordnen und die Ausgabe mit awk drucken soll.

Danke, KJ

Antworten:


1

Erstellen Sie ein Skript, das zum Beispiel folgendermaßen aufgerufen script.shwird:

awk -v COLT=$1 '
        NR==1 {
                for (i=1; i<=NF; i++) {
                        if ($i==COLT) {
                                title=i;
                                print $i;
                        }
                }
        }
        NR>1 {
                if (i=title) {
                        print $i;
                }
        }
' file

Wo fileist die Datei mit den Daten in Spalten.

Wenn Sie ein Problem haben, script.sh C-8lautet das Ergebnis:

C-8
30
21
67

Danke für die Lösung, es funktioniert einwandfrei. Können Sie bitte erklären, was "column = $ {column: (- 1)}" funktioniert.
KumarJohn

Nimmt das letzte Zeichen von Variablecolumn
jcbermu

Ich habe eine Änderung vorgenommen, um die * Titelspalte` anstelle einer Zahl zu verwenden
jcbermu

Dies funktioniert einwandfrei, wenn die Spaltennummern übereinstimmen. Wenn die Spaltennummern nicht übereinstimmen und der Spaltenname ein Text wie "Name" oder "Rollno" ist, funktioniert dieses Skript in diesem Fall nicht.
KumarJohn

Wenn es keine Bearbeitung gibt, wird nichts angezeigt. Wenn der Text in der Spalte beispielsweise Rollno entspricht , ändern Sie die Variable to_removeim Skript.
JCBERMU

1

Ohne awkkönnen Sie den folgenden Befehl verwenden:

cut $FILE -f `head -1 $FILE | tr "\t" "\n" | grep -n "^$COLUMNTITLE"'$' | cut -f 1 -d :`

Funktioniert nur, wenn es eine einzelne Spalte gibt, die mit der exakten übereinstimmt $COLUMNTITLE


1

Versuchen Sie es mit diesem:

function proj() {
    awk -v c="$1" 'NR==1 {for (i=1; i<=NF; i++) if ($i==c) break} {print $i}' "$2"
}

Verwenden Sie es wie folgt:

proj C-8 table.txt

Wenn Sie erwarten, Spaltennamen einzugeben, die in der Tabelle nicht vorhanden sind, sollten Sie Folgendes überprüfen: add i!=NF+1before {print $i}, andernfalls erhalten Sie so viele Leerzeilen wie die Zeilen der Tabelle.

Sie können es auch mithilfe einer Funktion in einer separaten Datei ablegen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.