2009-08-04 13 views
8

tengo un archivo llamado ip-list con dos columnas:manera elegante para revertir el orden de columnas

IP1 <TAB> Server1 
IP2 <TAB> Server2 

Y quiero producir:

Server1 <TAB> IP1 
Server2 <TAB> IP2 

¿Qué es la herramienta más elegante, más corta la línea de comandos de Linux para ¿hazlo?

+0

¿Qué plataforma? Windows, Unix, Max. . . –

+0

Agregado "Linux". Gracias. –

Respuesta

12

Uso awk:

awk '{print $2,$1}' ip-list 

que debe darle lo que quiere.

+2

Vale la pena señalar que da el resultado como delimitado por espacios, pero es bastante trivial insertar el tabulador de escape si lo necesita. –

3

La solución más simple es:

 
awk '{print $2 "\t" $1}' 

Sin embargo, hay algunas cuestiones. Si puede haber espacio en blanco en cualquiera de los campos, que tiene que hacer uno de: (dependiendo de si su awk apoya -v)

 
awk -v FS='\t' '{print $2 "\t" $1}' 
awk 'BEGIN{ FS="\t" } {print $2 "\t" $1}' 

Como alternativa, puede hacer uno de:

 
awk -v OFS='\t' '{print $2,$1}' 
awk 'BEGIN{ OFS="\t" } {print $2,$1}' 
awk -v FS='\t' -v OFS='\t' '{print $2,$1}' # if allowing spaces in fields 

Uno de los comentarios pregunta, '¿a dónde va el nombre del archivo'? awk se utiliza como filtro, por lo que normalmente aparece como:

 
$ some-cmd | awk ... | other-cmd 

sin nombre de archivo. O bien, un nombre de archivo se puede dar como argumento después de todos los comandos:

 
$ awk ... filename 
+0

¿A dónde va el nombre del archivo? –

0

perl -pi -e 's/^([^\t]+)\t([^\t]+)$/\2\t\1/' yourfile.csv

perl -pi -e 'split("\t"); print "$_[1]\t$_[0]"'

La primera de ellas, probablemente trabaja en sed, también.

Cuestiones relacionadas