2013-05-06 7 views
5

Ich versuche mit awk die ersten drei Felder in einer Textdatei zu entfernen. Das Entfernen der ersten drei Felder ist einfach. Aber der Rest der Zeile wird von awk verkorkst: die Trennzeichen aus Registerkarte Raum geändertEntfernen Sie die ersten Spalten und lassen Sie die verbleibende Zeile in awk unverändert

Hier ist, was ich versucht habe:

head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }' 

Die ersten drei Spalten ordnungsgemäß entfernt werden. Das Problem ist, dass die Ausgabe mit den Tabs zwischen Spalten $ 4 $ 5 $ 6 usw. in Leerzeichen konvertiert wird.

+1

Es gibt keine Variable in awk den Namen "IFS". Shell hat IFS, awk hat FS. –

Antwort

5

zuerst als ED kommentiert, müssen Sie FS als Feldtrennzeichen in awk verwenden. tab wird space in Ihrer Ausgabe, weil Sie OFS nicht definiert haben.

awk 'BEGIN{FS=OFS="\t"}{$1=$2=$3="";print}' file 

dies die ersten drei Felder, und lassen Sie Rest Text „unberührt“ entfernen (Sie werden die führenden drei Registerkarten). auch in der Ausgabe würde die <tab> behalten werden.

awk 'BEGIN{FS=OFS="\t"}{print $4,$5,$6}' file 

wird ohne führende Leerzeichen/Tabs ausgegeben. aber wenn Sie 500 Spalten haben, müssen Sie es in einer Schleife tun, oder sub Funktion verwenden oder andere Werkzeuge betrachten, zum Beispiel schneiden.

3

Wenn Sie nicht möchten, dass die Feldtrennung dann sed verändert verwenden, um die ersten 3 Spalten entfernen statt:

sed -r 's/(\S+\s+){3}//' file 

Um die Änderungen zu speichern, zurück in die Datei können Sie die -i Option:

sed -ri 's/(\S+\s+){3}//' file 
4

Eigentlich kann dies in einem sehr einfachen Schnitt Befehl wie folgt geschehen:

cut -f4- inFile 
+0

Ich wünschte, es war nicht gepuffert. – Nakilon

0
awk '{for (i=4; i<NF; i++) printf $i " "; print $NF}' 
+0

dieser Fehler tritt auf, wenn die letzte Spalte doppelten Platz in den Namen enthält –

+0

Dies führt nicht zur erwarteten Ausgabe, wenn weniger als vier Felder in einer Zeile vorhanden sind. (Es wird das letzte von ihnen drucken, anstatt alles zu entfernen.) Stattdessen könnten Sie verwenden: 'awk '{für (i = 4; i <= NF; i ++) printf $ i" "; printf "\ n"} '' Oder fügen Sie zusätzliche Logik hinzu, um das nachfolgende Leerzeichen zu verhindern. – Wildcard

Verwandte Themen