Come posso eliminare alcune colonne da un file di campi separati da tabulazioni con awk
?Eliminazione di colonne da un file con awk o da riga di comando su linux
c1 c2 c3 ..... c60
Ad esempio, eliminare colonne tra 3 e 29.
Come posso eliminare alcune colonne da un file di campi separati da tabulazioni con awk
?Eliminazione di colonne da un file con awk o da riga di comando su linux
c1 c2 c3 ..... c60
Ad esempio, eliminare colonne tra 3 e 29.
È 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:
Questo è ciò che il comando cut
è per:
cut -f1,2,30- inputfile
Il valore predefinito è scheda. Puoi cambiarlo con lo switch -d
.
Ho dovuto rimuovere l'ultimo '-' per farlo funzionare in Ubuntu. Se lo lascio, 'cut' stamperebbe tutte le colonne. Qualcuno ha avuto anche questo problema? –
Dovrebbe stampare le colonne uno, due e trenta fino all'ultimo (60 nella domanda). Se non è un bug in Ubuntu! –
Aaaah, ok. Ho fatto un errore. Colpa mia. –
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
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' –
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
Questa risposta su StackOverflow può aiutare: http://stackoverflow.com/questions/2626274/awk-print-all-other-columns-but-not-1-2-and-3 – iwg