2013-05-06 8 views
5

Sto tentando di utilizzare awk per rimuovere i primi tre campi in un file di testo. Rimozione dei primi tre campi è facile. Ma il resto della linea viene incasinato da awk: i delimitatori vengono modificate da scheda a spazioRimuove le prime colonne e lascia intatta la riga rimanente in awk

Ecco che cosa ho provato:

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

Le prime tre colonne vengono rimossi correttamente. Il problema è che l'output finisce con le schede tra le colonne $ 4 $ 5 $ 6, ecc. Convertiti in spazi.

+1

Non v'è alcuna variabile denominata "se" in awk. la shell ha IFS, awk ha FS. –

risposta

5

come prima commentato ED, è necessario utilizzare FS come separatore di campo in awk. tab diventa space nell'output, perché non è stato definito OFS.

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

questo rimuoverà i primi 3 campi, e lasciare il testo di riposo "intatta" (vedrete i principali 3 schede). anche in uscita sarebbe mantenuto il <tab>.

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

uscirà senza spazi iniziali/tabulazioni. ma se hai 500 colonne devi farlo in un ciclo, o usare la funzione sub o prendere in considerazione altri strumenti, tagliare, per esempio.

3

Se non si desidera che la separazione campo alterato quindi utilizzare sed per rimuovere i primi 3 colonne invece:

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

Per memorizzare le modifiche al file, è possibile utilizzare l'opzione -i:

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

In realtà questo può essere fatto in modo molto semplice comando di taglio come questo:

cut -f4- inFile 
+0

Vorrei che non fosse bufferizzato. – Nakilon

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

questo fallisce se l'ultima colonna contiene il doppio spazio nei nomi –

+0

Questo non riesce a produrre l'output previsto se ci sono meno di quattro campi su qualsiasi riga. (Stamperà l'ultimo di essi invece di rimuoverli tutti). Invece si potrebbe usare: 'awk '{for (i = 4; i <= NF; i ++) printf $ i" "; printf "\ n"} ''Oppure aggiungi qualche logica aggiuntiva per impedire lo spazio finale. – Wildcard