2012-11-13 5 views
5

Ich habe eine große Datei mit mehreren tausend Spalten. Ich möchte einige spezifische Spalten und die Feldtrennzeichen gleichzeitig mit AWK in Bash löschen.Wie entfernen Sie mehrere Spalten und die Feldtrennzeichen gleichzeitig in AWK?

ich eine Spalte zu einer Zeit mit diesem oneliner löschen kann (Spalte 3 wird gelöscht und der entsprechende Feldtrenn werden):

awk -vkf=3 -vFS="\t" -vOFS="\t" '{for(i=kf; i<NF;i++){ $i=$(i+1);}; NF--; print}' < Big_File 

Allerdings habe ich mehrere Spalten auf einmal löschen will ... Kann jemand Hilf mir das herauszufinden?

+0

Nein, es ist nicht. Hier wählen Sie bestimmte Spalten, nicht Spalten innerhalb eines Intervalls ... – Bebe

+0

Ich bitte um Unterschiede. In beiden oben erwähnten Fragen treten Antworten zum Entfernen beider Bereiche und Spaltenlisten auf. – Thor

+0

Für AWK, ich konnte es nicht wirklich finden ... – Bebe

Antwort

2

Hier ist eine Implementierung von Kamil Idee:

awk -v remove="3,8,5" ' 
    BEGIN { 
    OFS=FS="\t" 
    split(remove,a,",") 
    for (i in a) b[a[i]]=1 
    }               
    { 
    j=1 
    for (i=1;i<=NF;++i) { 
     if (!(i in b)) { 
     $j=$i 
     ++j 
     } 
    } 
    NF=j-1 
    print 
    } 
' 
+0

Vielen Dank, aber das Skript ändern die Feldtrennzeichen, ich möchte weiterhin "Tab" als Trennzeichen verwenden, irgendeine Idee? – Bebe

+0

@Bebe: True - ich habe es korrigiert. –

+0

Das ist es! Vielen Dank! – Bebe

4

Sie können die Liste der Spalten übergeben von Shell werden gelöscht awk wie folgt aus:

awk -vkf="3,5,11" ... 

dann im awk Programm es in Array analysieren:

split(kf,kf_array,",") 

und dann gehen Sie durch die ganze Spalten und testen, ob jede bestimmte Spalte in der kf_array ist und möglicherweise überspringen

Andere Möglichkeit ist, rufen Sie Ihren oneliner Server al mal :-)

2

Wenn Sie cut statt awk verwenden können, ist dies ein einfacher, mit cut:

z.B. diese erhält Spalten 1,3 und 50 auf aus Datei:

cut -f1,3,50- file

0

So etwas sollte funktionieren:

awk -F'\t' -v remove='3|8|5' ' 
{ 
    rec=ofs="" 
    for (i=1;i<=NF;i++) { 
     if (i !~ "^(" remove ")$") { 
     rec = rec ofs $i 
     ofs = FS 
     } 
    } 
    print rec 
} 
' file 
Verwandte Themen