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

KumarJohn
quelle

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
jcbermu
quelle
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

Joce
quelle
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.

cYrus
quelle