2017-08-10 8 views
1

eine spezifische Spaltennummer nach Spaltenname erhalten. Ich habe n Anzahl der Dateien, in diesen Dateien wird eine spezifische Spalte namens "thrudate" in jeder Spalte mit unterschiedlicher Spaltennummer angegeben.Mit awk

Ich möchte nur den Wert dieser Spalte aus allen Dateien auf einmal extrahieren. Also habe ich versucht mit awk. Hier Ich betrachte nur eine Datei, und Extrahieren der Werte von thrudate

awk -F, -v header=1,head="" '{for(j=1;j<=2;j++){if($header==1){for(i=1;i<=$NF;i++){if($i=="thrudate"){$head=$i;$header=0;break}}} elif($header==0){print $0}}}' file | head -10 

Wie ich genähert haben:

  • verwendet Befehl find alle ähnliche Dateien zu finden und dann den zweiten Schritt für jede Ausführung Datei
  • Schleife alle Felder in der ersten Zeile, die Überprüfung der Spaltenname mit Header-Werten wie 1 (initialisiert es auf 1, um nur die erste Zeile zu überprüfen), sobald es mit 'thrudate' übereinstimmt, setze ich Header als 0, dann von diesem brechen Schleife.
  • Sobald ich die Spalte Nummer, dann drucken Sie es für jede Zeile.

Antwort

3

Sie können folgende awk-Skript verwenden:

print_col.awk:

# Find the column number in the first line of a file 
FNR==1{ 
    for(n=1;n<=NF;n++) { 
     if($n == header) { 
      next 
     } 
    } 
} 

# Print that column on all other lines 
{ 
    print $n 
} 

Dann find verwenden dieses Skript auf jede Datei auszuführen:

find ... -exec awk -v header="foo" -f print_col.awk {} + 

In Kommentaren haben Sie nach einer Version gefragt, die mehrere Spalten basierend auf ihren Kopfzeilennamen drucken könnte. Sie können das folgende Skript für das verwenden:

print_cols.awk:

BEGIN { 
    # Parse headers into an assoc array h 
    split(header, a, ",") 
    for(i in a) { 
     h[a[i]]=1 
    } 
} 

# Find the column numbers in the first line of a file 
FNR==1{ 
    split("", cols) # This will re-init cols 
    for(i=1;i<=NF;i++) { 
     if($i in h) { 
      cols[i]=1 
     } 
    } 
    next 
} 

# Print those columns on all other lines 
{ 
    res = "" 
    for(i=1;i<=NF;i++) { 
     if(i in cols) { 
      s = res ? OFS : "" 
      res = res "" s "" $i 
     } 
    } 
    if (res) { 
     print res 
    } 
} 

Nennen Sie es wie folgt aus:

find ... -exec awk -v header="foo,bar,test" -f print_cols.awk {} + 
+0

danke, diese verdammt richtig ist, wollte nur wissen, ob können wir das tun, um 2 Spalten zu holen? – ggupta

+0

Ich habe das hinzugefügt. – hek2mgl

+0

Hut ab, mach eine Verbeugung (Y) vielen Dank. – ggupta