2014-11-16 19 views
5

Qual è il modo migliore per riordinare le colonne in bash?Colonne shuffle

reale esempio:

ho lima one.txt contiene:

firstName secondName telNumber 

voglio creare il file second.txt dal primo file

secondName firstName telNubmer 

Come posso raggiungere questo obiettivo ? (Scambia le colonne solo una riga)

+1

Puoi 'awk '{tmp = $ 1; $ 1 = $ 2; $ 2 = tmp;} 'your_file' – Maroun

+0

@AvinashRaj Qual è la differenza? – Maroun

+0

@ MarounMaroun: Praticamente, non c'è molta differenza, ma la risposta di Avinash è leggermente migliore dato che non richiede la creazione della variabile 'tmp'. A proposito, non è una buona idea pubblicare le risposte nei commenti. –

risposta

8

Usa awk.

awk '{print $2,$1,$3}' infile > outfile 
+2

Amo le risposte di 'awk';) – Maroun

2

E solo per divertimento, ecco una soluzione di sed che è (quasi) equivalente in azione al comando awk di Avinash Raj.

sed 's/[[:space:]]*\([^[:space:]]*\)[[:space:]]*\([^[:space:]]*\)[[:space:]]*/\2 \1 /' infile > outfile 

Ovviamente, la soluzione awk è molto più facile da leggere. :) OTOH, la versione sed fa fronte a linee con più di 3 campi.

E se siamo in grado di garantire che le linee saranno sempre essere esattamente della forma

firstName secondName telNumber 

senza spazi aggiuntivi o altri spazi bianchi (ad esempio schede), siamo in grado di condensare il comando sed verso il basso per :

sed 's/\([^ ]*\) \([^ ]*\)/\2 \1/' 

ho appena fatto un test di sincronizzazione veloce su un file contenente 500.000 linee (generato usando awk). La versione condensata di sed è 10 volte più lenta della versione di awk. Immaginai che sarebbe stato un po 'più lento, dal momento che sed utilizza regex, ma non pensavo che sarebbe stato che molto più lento.

FWIW, un equivalente Python del comando aw di Avinash Raj è circa due volte più lento della versione di awk.


Ho appena riletto la domanda. Lo appare che il file nell'OP ha solo una riga di dati. In questo caso, siamo in grado di fare questo in modo molto semplice, utilizzando puro bash:

read a b c <ONE.txt;echo> SECOND.txt "$b $a $c" 

O forse tilefrae sta dicendo che vogliono solo lo swap per accadere in prima fila, e per eseguire una copia piana di righe successive ... Se è così, è facile modificare i programmi awk o sed per fare proprio questo.