2009-06-24 16 views
25

voglio fare qualcosa di simile:Forzare l'ordine dei campi di uscita dal comando cut

cat abcd.txt | cut -f 2,1 

e voglio l'ordine di essere 2 e poi 1 in uscita. Sulla macchina che sto testando (FreeBSD 6), questo non sta accadendo (la sua stampa in ordine di 1,2). Puoi dirmi come si fa?

So che posso sempre scrivere uno script di shell per fare questo rovesciamento, ma sto cercando qualcosa usando le opzioni di comando 'taglia'.

Penso di utilizzare la versione 5.2.1 di coreutils che contengono il taglio.

risposta

27

Questo non può essere eseguito utilizzando tagliato. Secondo la pagina man:

L'input selezionato viene scritto nello stesso ordine in cui viene letto e viene scritto esattamente una volta.

Invece, è possibile farlo utilizzando awk, in questo modo:

awk '{print($2,"\t",$1)}' abcd.txt 

Sostituire il \ t con qualsiasi cosa tu stia usando come separatore di campo.

11

La risposta di Lars è stata ottima, ma ne ho trovata una ancora migliore. Il problema con il suo è corrisponde \ t \ t come nessuna colonna. Per risolvere questo uso il seguente:

awk -v OFS=" " -F"\t" '{print $2, $1}' abcd.txt 

Dove:

-F"\t" è quello di tagliare il esattamente (schede).

-v OFS=" " è cosa separata con (due posti)

Esempio:

echo 'A\tB\t\tD' | awk -v OFS=" " -F"\t" '{print $2, $4, $1, $3}' 

Questo uscite:

B D A  
+1

In Cygwin ho dovuto sostituire -F "\ t" con - F fare questo lavoro –