2009-08-04 13 views
8

Mam plik o nazwie ip-list z dwóch kolumn:elegancki sposób, aby odwrócić kolejność kolumn

IP1 <TAB> Server1 
IP2 <TAB> Server2 

I chcę produkować:

Server1 <TAB> IP1 
Server2 <TAB> IP2 

Jaki jest najbardziej elegancki, najkrótsza narzędzie linii poleceń Linuksa do Zrób to?

+0

Która platforma? Windows, Unix, Max. . . –

+0

Dodano "Linux". Dzięki. –

Odpowiedz

12

Zastosowanie awk:

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

To powinno dać ci to, co chcesz.

+2

Warto zauważyć, że daje wynik jako oddzielony spacją, ale jest raczej trywialne, aby wstawić ucieczkę tabulacji, jeśli jej potrzebujesz. –

3

Najprostszym rozwiązaniem jest:

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

Istnieją jednak pewne problemy. Jeśli nie może być spacji w jednej z dziedzin, trzeba wykonać jedną z: (w zależności, czy awk obsługuje -v)

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

Alternatywnie, można wykonać jedną z:

 
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 

Jeden z komentarzy pyta: "gdzie jest nazwa pliku"? awk jest używany jako filtr, więc zwykle pojawia się jako:

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

bez podanej nazwy pliku. Lub nazwa pliku może być podany jako argument po wszystkich poleceń:

 
$ awk ... filename 
+0

Skąd nazwa pliku? –

0

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

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

Pierwszy prawdopodobnie działa na sed, too.

Powiązane problemy