2011-09-26 3 views

risposta

11

È possibile loop su tutte le colonne e filtrare quelle che non si vuole:

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 

dove il NF ti dà il numero totale di campi di un record.
Per ogni colonna che soddisfa la condizione stampiamo la colonna seguita da uno spazio " ".


EDIT: aggiornato dopo osservazione da johnny:

awk -F 'FS' 'BEGIN{FS="\t"}{for (i=1; i<=NF-1; i++) if(i<3 || i>5) {printf $i FS};{print $NF}}' input.txt 

questo è migliorata in 2 modi:

  • mantiene i separatori originali
  • non aggiunge un separatore alla fine
+0

Non dovrebbe si stampa una scheda (\ t) invece di uno spazio. Vuole rimuovere i campi, forse non rimuovere le schede allo stesso tempo (se ho capito bene). – johnny

+0

@johnny: hai ragione. Ho aggiornato il codice in modo che dovrebbe considerare correttamente il separatore. – oliver

41

Questo è ciò che il comando cut è per:

cut -f1,2,30- inputfile 

Il valore predefinito è scheda. Puoi cambiarlo con lo switch -d.

+0

Ho dovuto rimuovere l'ultimo '-' per farlo funzionare in Ubuntu. Se lo lascio, 'cut' stamperebbe tutte le colonne. Qualcuno ha avuto anche questo problema? –

+0

Dovrebbe stampare le colonne uno, due e trenta fino all'ultimo (60 nella domanda). Se non è un bug in Ubuntu! –

+0

Aaaah, ok. Ho fatto un errore. Colpa mia. –

1
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1' 

ingresso

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 

uscita

c1 c2 c16 c17 c18 c19 c20 c21 
+0

Questo non elimina le colonne. Li cancella e ristampa ... con OP 'specificato' O * FS' di '\ t' sostituito da un singolo spazio, che non hanno chiesto. La cancellazione di _apparent_ è casuale e ha bisogno di 'FS' e' OFS' come default '\ s +'. Un separatore abbastanza inutile e incompatibile con OP '' t', a meno che il loro file non coincida per caso con campi vuoti, poiché li schiaccherebbe in file seghettate. Qualsiasi altro separatore, ad es. '' T ', OP restituisce l'output che ha ancora le colonne indesiderate, ma ora vuoto. E '$ 0 = $ 0' è ridondante e potrebbe essere dispendioso. Il metodo documentato per ricostruire un record è '$ 1 = $ 1' –

0

soluzione Perl 'splice' che non aggiunge spazi iniziali o finali:

perl -lane 'splice @F,3,27; print join " ",@F' file 

Produce in uscita:

c1 c2 c30 c31